170

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

我确信有很简单的方法可以做到这一点——我只是不知道怎么做。

4

23 回答 23

422

只需调用Math.abs 即可。例如:

int x = Math.abs(-5);

这将设置x5.

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

于 2009-01-29T21:25:02.267 回答
108

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

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

或者

if (number < 0)
    number = -number;
于 2009-01-29T21:25:17.460 回答
21

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

于 2009-01-29T21:25:43.560 回答
12

使用abs功能:

int sum=0;
for(Integer i : container)
  sum+=Math.abs(i);
于 2009-01-29T21:25:23.560 回答
9

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

int answer = -x;

有了这个,你可以把积极的变成消极的,把消极的变成积极的。


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

int answer = Math.abs(x);

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

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

希望能帮助到你!祝你好运!

于 2016-10-09T00:32:23.933 回答
8

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

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20
于 2011-03-07T14:02:41.890 回答
6

你问的是绝对值吗?

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

于 2009-01-29T21:25:14.263 回答
6

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

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

打印出“1”。

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

import static java.lang.Math.abs;

连同您的导入,您可以abs()通过编写来引用 -function

System.out.println(abs(-1));
于 2009-01-29T21:25:44.747 回答
5

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

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

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

于 2009-01-29T21:25:41.003 回答
5

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


获取绝对值的逻辑很简单:"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 classvalue = Math.abs(value);

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

如果您绝对需要跳过该函数,您可以使用value = (value < 0) ? (-value) : value;,它只是我在逻辑(3rd)部分中提到的代码的更紧凑版本,使用三元运算符 ( ? :)


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

您可以简单地获取绝对值并将其取反,而不是进行一些复杂的检查: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));
}
于 2013-09-11T15:25:12.287 回答
4

你为什么不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;
于 2012-02-22T12:14:14.640 回答
2

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

private static int makeAbsolute(int number){
     if(number >=0){
        return number;
     } else{
        return (~number)+1;
     }
}
于 2011-11-16T18:20:59.210 回答
2

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

于 2019-06-06T11:11:05.290 回答
1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

或者:

int i = -123;
System.out.println(Math.abs(i));
于 2011-03-16T15:24:58.407 回答
1

我会推荐以下解决方案:

没有库乐趣:

    value = (value*value)/value

(以上实际上不起作用。)

与库乐趣:

   value = Math.abs(value);
于 2014-01-04T09:31:57.157 回答
1

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

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

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

例子

公共静态无效主要(字符串[]参数){

    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

于 2019-10-30T11:09:36.327 回答
0

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

于 2011-02-24T16:53:04.583 回答
0

你能试试这个吗?

public static int toPositive(int number) {
    return number & 0x7fffffff;
}
于 2019-10-18T02:37:45.163 回答
0
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)
于 2020-09-15T19:36:27.143 回答
0

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

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

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

于 2020-10-10T16:17:07.920 回答
-1

在 kotlin 中,您可以使用 unaryPlus

input = input.unaryPlus()

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

于 2020-04-05T22:12:55.100 回答
-1

在 for 循环中试试这个:

sum += Math.abs(arr[i])
于 2020-12-20T02:30:40.260 回答
-3

不要这样做

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

或者

if (number < 0) number = -number;

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

于 2013-11-05T19:08:04.977 回答