我怎样才能有效地使数字的绝对值接近零?

时间:2014-07-11 22:45:13

标签: java absolute-value

我知道实现这个目标的一种可行方法:

int a = 7;
int b = -10;

public int makeSmaller(int num) {
  int result = Math.abs(num) - 1;
  if(num > 0) return result;
  else return -result;
}

makeSmaller(a); //returns 6
makeSmaller(b); //returns -9

有没有更简洁的方法可以用来使这个更清洁一点?

修改

我希望该方法将结果更接近于零返回0,因此除以2或任何其他数字将不起作用。两者都不会乘以0.

4 个答案:

答案 0 :(得分:4)

使用signum:

public static int makeSmaller(int val) {
    return val-Integer.signum(val);
}

答案 1 :(得分:1)

使用Math.abs并不能获得任何收益,因为您无论如何都在测试这个标志。

因此,更简洁的表述:

public int makeSmaller(int num) {
  return num > 0? num-1 : num+1;
}

因为你说你想让它更接近零,你也应该检查零情况:

public int towardZero(int num) {
  if (num == 0) return 0;
  else return num > 0? num-1 : num+1;
}

答案 2 :(得分:1)

public int makeSmaller(int num) {
  int result = Math.abs(num) - 1;
  if(num > 0) return result;
  else return -result;
}

为什么不呢?

public int makeSmaller(int num) {
    return num - (num/Math.abs(num));
}

括号部分将始终与数字相同,并且始终为1(加号或减号)。

所以,鉴于7 ......

7 - (7 / | 7 |)= 7 - 1 = 6

鉴于-10 ......

-10 - ( - 10 / | -10 |)= - 10 - ( - 10/10)= -10 - ( - 1)= -10 + 1 = -9

答案 3 :(得分:0)

不太可读,但工作:

    int q = -10;

    final int s[] = new int[]{-1, 1};
    q += s[(q>>>31)];

    System.out.println(q); // print -9

    int q = 10;

    final int s[] = new int[]{-1, 1};
    q += s[(q>>>31)];

    System.out.println(q); // print 9

所以你可以把你的功能重写为:

final static int[] signsInc = new int[]{-1, 1};
public static int makeSmaller(final int num) {
    return (num != 0) ? (num + signsInc[(num>>>31)]) : 0;
}