使负数为正


146

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

我敢肯定有很简单的方法可以做到-我只是不知道怎么做。



5
令我感到惊讶的是,这样的基本问题如何得到如此多的赞誉……
Jose Rui Santos

我的问题比这更合理,但是却有很多不足之处
没有人

Answers:



103

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

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

要么

if (number < 0)
    number = -number;

21
哦,两难时机-有很多同样好的答案,我也删除我的。但是那样的话,我将失去40分,而如果我那样做,我将永远不会追上乔恩·斯凯特。
Paul Tomblin,2009年

3
对不起,-1重塑了标准库调用。
cletus

12
@cletus,您是否注意到我已经提到了标准库调用?还是在这种情况下,“重塑”所需的指令少于调用库的指令?
Paul Tomblin,2009年

同样值得了解库调用背后的细节。特别是在库调用有副作用或保罗提到的性能问题时。
simon

也由于@cletus -1而+1。通过显示问题的最佳标准解决方案以及该解决方案的实际作用(或类似作用),可以创建更好的程序员。
弗朗西斯科·扎拉波索



8

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

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

3
我们可以乘以-1而不是这样做。我有什么想念的吗?
Siva Kranthi Kumar

7

试试看(x前面的负数是有效的,因为它是一元运算符,请在此处找到更多信息):

int answer = -x;

这样,您可以将正数变为负数,并将负数变为正数。


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

int answer = Math.abs(x);

,如果出于某种原因不想使用abs()方法,请尝试以下操作:

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

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


6

您是否在询问绝对值?

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


6

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

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

打印出“ 1”。

如果要避免编写Math.-part,可以静态包含Math util。写就好了

import static java.lang.Math.abs;

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

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

5

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

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

进行逻辑更改以反映代码的结构。也许很详细,但是它可以满足您的要求。


3
您可以使用静态导入来使其不再那么冗长。
丹·代尔

1
如果他直接控制这些值,那么简单地删除-符号就不是更好吗?否则,包括他没有控制权在内,使用类似的函数absoluteSum( int[] values ){ /*loop with Math.abs()*/ }代替在每个值中手动包装Math.abs()会更好吗?[-1]
XenoRo 2013年

我同意。将逻辑封装在功能强大的函数中将使这一点更加清楚。
Eddie 2013年

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()功能!他们提供它是有原因的!

如果您绝对需要跳过该函数,则可以使用Ternary运算符(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));
}

3

你为什么不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;

2

如果您对二进制补码的机制感兴趣,可以使用以下绝对无效的示例性方法:

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

为什么绝对低效?我看不到任何使它效率低下的循环。我错过了什么?
aldok,

2

我建议以下解决方案:

没有lib的乐趣:

    value = (value*value)/value

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

带有lib乐趣:

   value = Math.abs(value);

14
第一个不会再导致负数吗?
user2875404 '02

1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

或者:

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

1

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


1

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

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

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

公共静态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


0

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


4
Long.MIN_VAL的全部要点是,您不能拥有“小于LONG.MIN_VAL”的长线。
保罗·汤布林

0

你能试试这个吗?

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

4
在一个已有10年历史的问题上,还有17个其他答案,您应该在解释这个问题的新内容。如果问题最终出现在审阅队列中,则以问题开始回答是一种很好的方法。
詹森·艾勒


-3

不要这样做

数字=(数字<0?-数字:数字);

要么

如果(数字<0)数字=-数字;

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.