【问题标题】:Make a negative number positive使负数为正
【发布时间】:2010-10-04 08:33:47
【问题描述】:

我有一个 Java 方法,我在其中对一组数字求和。但是,我希望将任何负数视为正数。所以 (1)+(2)+(1)+(-1) 应该等于 5。

我确信有很简单的方法可以做到这一点 - 我只是不知道如何。

【问题讨论】:

  • 让我惊讶的是,这些基本问题如何得到如此多的支持......
  • 我的问题比这更合理,但它却有更多的反对意见
  • 数字本身乘以-1

标签: java negative-number


【解决方案1】:

只需致电Math.abs。例如:

int x = Math.abs(-5);

这会将x 设置为5

请注意,如果您传递Integer.MIN_VALUE,将返回相同的值(仍然为负),因为int 的范围不允许表示正等值。

【讨论】:

  • 注意边缘情况,例如Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE。
  • ((a
  • 这不包括Integer.MIN_VALUE 的边缘条件。参考这个youtu.be/IWrpDP-ad7g
  • @vs_lala:是的,已经添加了注释。
【解决方案2】:

你问的是绝对值吗?

Math.abs(...) 是您可能想要的函数。

【讨论】:

    【解决方案3】:

    您所描述的概念称为“绝对值”,Java 有一个名为Math.abs 的函数可以为您完成。或者你可以避免函数调用并自己做:

    number = (number < 0 ? -number : number);
    

    if (number < 0)
        number = -number;
    

    【讨论】:

    • 哦,进退两难的时间 - 有这么多同样好的答案,我不妨删除我的。但是那样我会失去 40 分,如果我这样做,我将永远追不上 Jon Skeet。
    • 抱歉 -1 重新发明了标准库调用。
    • @cletus,你注意到我已经提到了标准库调用吗?或者在这种情况下,“重新发明”需要比调用库更少的指令?
    • 也值得了解库调用背后的细节。特别是如果库调用有副作用,或者 Paul 提到的性能问题。
    • 这不适用于“-2147483648”,猜猜为什么?
    【解决方案4】:

    使用abs函数:

    int sum=0;
    for(Integer i : container)
      sum+=Math.abs(i);
    

    【讨论】:

      【解决方案5】:

      最简单但冗长的方法是将每个数字包装在 Math.abs() 调用中,因此您可以添加:

      Math.abs(1) + Math.abs(2) + Math.abs(1) + Math.abs(-1)
      

      通过逻辑更改来反映您的代码结构。也许很冗长,但它可以满足您的需求。

      【讨论】:

      • 您可以通过静态导入使其不那么冗长。
      • 如果他可以直接控制这些值,那么简单地删除- 符号不是更好吗?否则,包括如果他没有控制权,使用像absoluteSum( int[] values ){ /*loop with Math.abs()*/ } 这样的函数而不是在每个值中手动包装 Math.abs() 不是更好吗? [-1]
      • 我同意。将逻辑封装在一个命名良好的函数中会更清楚。
      【解决方案6】:

      你在寻找绝对价值,伙计。 Math.abs(-5) 返回 5...

      【讨论】:

        【解决方案7】:

        您想将每个数字包装成Math.abs()。例如

        System.out.println(Math.abs(-1));
        

        打印出“1”。

        如果您想避免编写 Math.-part,您可以静态包含 Math 实用程序。就写吧

        import static java.lang.Math.abs;
        

        与您的导入一起,您可以通过编写来引用abs()-函数

        System.out.println(abs(-1));
        

        【讨论】:

          【解决方案8】:

          我需要 long 的绝对值,并深入研究 Math.abs 并发现如果我的参数小于 LONG.MIN_VAL 即 -9223372036854775808l,那么 abs 函数将不会返回绝对值,而只会返回最小值价值。在这种情况下,如果您的代码进一步使用此 abs 值,则可能会出现问题。

          【讨论】:

          • Long.MIN_VAL 的全部意义在于你不能有一个“小于 LONG.MIN_VAL”的 long。
          【解决方案9】:

          此代码在正数上调用是安全的。

          int x = -20
          int y = x + (2*(-1*x));
          // Therefore y = -20 + (40) = 20
          

          【讨论】:

          • 我们可以乘以 -1 而不是这样做。我错过了什么吗?
          【解决方案10】:
          String s = "-1139627840";
          BigInteger bg1 = new BigInteger(s);
          System.out.println(bg1.abs());
          

          或者:

          int i = -123;
          System.out.println(Math.abs(i));
          

          【讨论】:

            【解决方案11】:

            如果您对二进制补码的机制感兴趣,这里是绝对低效但说明性的低级方法:

            private static int makeAbsolute(int number){
                 if(number >=0){
                    return number;
                 } else{
                    return (~number)+1;
                 }
            }
            

            【讨论】:

            • 为什么绝对低效?我没有看到任何使其效率低下的循环。我错过了什么吗?
            【解决方案12】:

            你为什么不multiply that number with -1

            像这样:

            //Given x as the number, if x is less than 0, return 0 - x, otherwise return x:
            return (x <= 0.0F) ? 0.0F - x : x;
            

            【讨论】:

              【解决方案13】:

              当您需要表示一个没有丢失或缺失概念的值(负值)时,称为“绝对值”。


              获取绝对值的逻辑很简单:"If it's positive, maintain it. If it's negative, negate it"


              这意味着你的逻辑和代码应该像下面这样工作:

              //If value is negative...
              if ( value < 0 ) {
                //...negate it (make it a negative negative-value, thus a positive value).
                value = negate(value);
              }
              

              有两种方法可以否定一个值:

              1. 好吧,否定它的价值:value = (-value);
              2. 乘以“100% 负”或“-1”:value = value * (-1);

              两者实际上是同一枚硬币的两个面。只是你通常不记得value = (-value);实际上是value = 1 * (-value);


              嗯,至于你在 Java 中是怎么做的,这很简单,因为 Java 已经为此提供了一个函数,在Math class:value = Math.abs(value);

              是的,不使用Math.abs() 只是一行代码,数学非常简单,但为什么要让你的代码看起来很难看呢?只需使用 Java 提供的Math.abs() 函数!他们提供它是有原因的!

              如果你绝对需要跳过这个函数,你可以使用value = (value &lt; 0) ? (-value) : value;,它只是我在逻辑(3rd)部分提到的代码的一个更紧凑的版本,使用Ternary operator (? :)


              此外,在某些情况下,您可能希望始终在可能接收正值和负值的函数中表示丢失或缺失。

              您可以简单地获取绝对值并将其取反,而不是进行一些复杂的检查:negativeValue = (-Math.abs(value));


              考虑到这一点,并考虑像您这样的多个数字之和的情况,实现一个函数将是一个好主意:

              int getSumOfAllAbsolutes(int[] values){
                int total = 0;
                for(int i=0; i<values.lenght; i++){
                  total += Math.abs(values[i]);
                }
                return total;
              }
              

              根据您可能再次需要相关代码的可能性,将它们添加到您自己的“utils”库中也是一个好主意,首先将这些函数拆分为其核心组件,并将最终函数简单地维护为一个嵌套对核心组件的现拆分函数的调用次数:

              int[] makeAllAbsolute(int[] values){
                //@TIP: You can also make a reference-based version of this function, so that allocating 'absolutes[]' is not needed, thus optimizing.
                int[] absolutes = values.clone();
                for(int i=0; i<values.lenght; i++){
                  absolutes[i] = Math.abs(values[i]);
                }
                return absolutes;
              }
              
              int getSumOfAllValues(int[] values){
                int total = 0;
                for(int i=0; i<values.lenght; i++){
                  total += values[i];
                }
              return total;
              }
              
              int getSumOfAllAbsolutes(int[] values){
                return getSumOfAllValues(makeAllAbsolute(values));
              }
              

              【讨论】:

                【解决方案14】:

                不要这样做

                number = (number

                if (number

                这将是一个错误,当您在代码上运行 find bug 时,它将报告为 RV_NEGATING_RESULT_OF

                【讨论】:

                  【解决方案15】:

                  我会推荐以下解决方案:

                  没有库乐趣:

                      value = (value*value)/value
                  

                  (上面的实际上是行不通的。)

                  带有库乐趣:

                     value = Math.abs(value);
                  

                  【讨论】:

                  • 第一个不会又是负数吗?
                  【解决方案16】:

                  试试这个(x前面的负数是有效的,因为它是一元运算符,查找更多here):

                  int answer = -x;
                  

                  有了这个,你可以把正面变成负面,把负面变成正面。


                  但是,如果您只想将负数设为正数,请尝试以下操作:

                  int answer = Math.abs(x);
                  

                  一个很酷的数学技巧!将数字平方将保证 x^2 的正值,然后,取平方根将得到 x 的绝对值:

                  int answer = Math.sqrt(Math.pow(x, 2));
                  

                  希望对您有所帮助!祝你好运!

                  【讨论】:

                    【解决方案17】:

                    可以使用库函数Math.abs()
                    Math.abs()返回参数的绝对值

                    • 如果参数为负,则返回参数的否定。
                    • 如果参数为正,则返回原样。

                    例如:

                    1. int x=-5;
                      System.out.println(Math.abs(x));

                    输出:5

                    1. int y=6;
                      System.out.println(Math.abs(y));

                    输出:6

                    【讨论】:

                      【解决方案18】:

                      你能试试这个吗?

                      public static int toPositive(int number) {
                          return number & 0x7fffffff;
                      }
                      

                      【讨论】:

                      • 在一个有 17 个其他答案的十年前的问题上,您应该解释您的答案所针对的问题的哪些新方面。如果问题最终出现在审核队列中,则以问题开始回答是一种关闭它的好方法。
                      • 这是不正确的。 -1 = 0xFFFFFFFF,然后 -0xFFFFFFFF & 0x7FFFFFFF = 0x7FFFFFFFFF,这与 1 不同。正如预期的负数的整数二进制格式是 2 的补码,所以这不可能。
                      【解决方案19】:

                      要将负数转换为正数(这称为绝对值),请使用 Math.abs()。这个 Math.abs() 方法是这样工作的

                      “number = (number &lt; 0 ? -number : number);".

                      在下面的例子中,Math.abs(-1) 会将负数 1 转换为正数 1。

                      例子

                      public static void main(String[] args) {

                          int total = 1 + 1 + 1 + 1 + (-1);
                          
                          //output 3
                          System.out.println("Total : " + total);
                          
                          int total2 = 1 + 1 + 1 + 1 + Math.abs(-1);
                          
                          //output 5
                          System.out.println("Total 2 (absolute value) : " + total2);
                          
                      }
                      

                      输出

                      总数:3 总计2(绝对值):5

                      【讨论】:

                        【解决方案20】:

                        在 kotlin 中你可以使用 unaryPlus

                        input = input.unaryPlus()
                        

                        https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/unary-plus.html

                        【讨论】:

                        • 它对负数没有任何作用。它对你有什么作用?您链接的文档中几乎没有信息
                        【解决方案21】:
                        if(arr[i]<0)
                        
                        Math.abs(arr[i]);  //1st way (taking absolute value)
                        
                        arr[i]=-(arr[i]); //2nd way (taking -ve of -ve no. yields a +ve no.)
                        
                        arr[i]= ~(arr[i]-1);   //3rd way (taking negation)
                        

                        【讨论】:

                          【解决方案22】:

                          我看到有人说Math.abs(number),但这种方法并不完全证明。

                          当您尝试包装 Math.abs(Integer.MIN_VALUE) 时失败(参见参考文献https://youtu.be/IWrpDP-ad7g

                          如果您不确定是否会在输入中收到Integer.MIN_VALUE。始终建议检查该号码并手动处理。

                          【讨论】:

                            【解决方案23】:

                            在 for 循环中试试这个:

                            sum += Math.abs(arr[i])
                            

                            【讨论】:

                            • 虽然这个答案是正确的,但需要提出此类问题的人可能还需要对 Math.abs() 函数是什么以及 += 的作用进行更多解释。
                            • 我建议人们从上到下阅读整个线程,以便任何澄清可能已经在顶部得到解决。 Math.abs 返回整数的正数和绝对值,而 += 运算是 sum = sum + arr[i] 的省略版本。
                            • 这条评论是关于这个特定答案的。一个答案不应该依赖另一个答案才能成为一个完整的答案,尤其是当它不引用另一个答案时。如果另一个答案被删除并且这个问题留下了这个不充分的答案,也会发生什么。
                            • w3schools.com/java/ref_math_abs.asp 是您了解 math.abs 工作原理的地方,w3schools.com/java/java_operators.asp 是您了解 += 作用的地方。
                            • 那么这需要在你的答案中。你不应该假设提问者知道在哪里可以找到这些信息。
                            猜你喜欢
                            • 2022-11-25
                            • 2022-01-20
                            • 2012-01-08
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-12-13
                            • 2015-06-14
                            • 1970-01-01
                            相关资源
                            最近更新 更多