Java Modulo不工作?

时间:2013-09-24 23:47:57

标签: java math

如果我问java:

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

并打印结果,它显示-0.785何时应该打印5.498 ...任何人都可以解释我为什么?

2 个答案:

答案 0 :(得分:3)

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

根据JLS, Section 15.17.3

  

[W]这里既不是无穷大,也不是零,也不是NaN   从被除数n除以a的浮点余数r   除数d由数学关系r = n - (d·q)定义   其中q是一个整数,只有当n / d为负时才为负数   只有在n / d为正且其幅度大到的情况下才为正   可能不超过真实数学的大小   n和d的商。

没有要求其余部分为正。

此处n-0.785d2 * Math.PI。幅度不超过真实数学商的最大q为0.所以......

r = n - (d * q) = -0.785 - (2 * Math.PI * 0) = -0.785

答案 1 :(得分:1)

好的,我不会比the other answer更好地解释它,但我们只是说如何得到你想要的结果。

功能:

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)5,而不是0),所以如果输出是divisor,那么而是返回0