-2

如果我要求 java:

System.out.print(-0.785 % (2*Math.PI));

并打印结果,当它应该打印 5.498 时它显示 -0.785 ......谁能解释我为什么?

4

2 回答 2

3

第一个操作数为负数,第二个操作数为正数。

根据JLS,第 15.17.3 节

[W] 这里既不涉及无穷大,也不涉及零,也不涉及 NaN,被除数 n 除以除数 d 得到的浮点余数 r 由数学关系 r = n - (d · q) 定义,其中q 是一个整数,仅当 n/d 为负时为负,仅当 n/d 为正时为正,并且其大小尽可能大而不超过 n 和 d 的真实数学商的大小。

不要求余数为正。

在这里,n-0.785d2 * Math.PIq幅度不超过真实数学商的最大值是0。所以......

r = n - (d * q) = -0.785 - (2 * Math.PI * 0) = -0.785
于 2013-09-24T23:56:45.740 回答
1

好的,我不会比其他答案更好地解释它,但我们只说如何获得您想要的结果。

功能:

static double positiveRemainder(double n, double divisor)
{
  if (n >= 0)
    return n % divisor;
  else
  {
    double val = divisor + (n % divisor);
    if (val == divisor)
      return 0;
    else
      return val;
  }
}

发生了什么:

如果n >= 0,我们只做一个标准余数。

如果n < 0,我们首先做一个余数,把它放在范围内(-divisor, 0],然后我们加divisor,把它放在我们想要的范围内(0, divisor]。但是等等,那个范围是错误的,它应该是[0, divisor)( 5 + (-5 % 5)is 5, not 0),所以如果输出是divisor,就直接返回0

于 2013-09-25T00:06:55.307 回答