-1

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

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

有没有更简洁的方法可以用来使它更清洁?

编辑

我希望该方法返回一个接近零的结果,正好乘以 1,因此除以 2 或任何其他数字都不起作用。两者都不会乘以 0。

4

4 回答 4

5

使用符号:

public static int makeSmaller(int val) {
    return val-Integer.signum(val);
}
于 2014-07-11T23:13:22.367 回答
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;
}
于 2014-07-11T22:51:54.657 回答
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

于 2014-07-11T23:24:21.167 回答
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;
}
于 2014-07-11T22:55:14.350 回答