2013-09-24 49 views
-2

如果我要为Java:Java Modulo无法正常工作?

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

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

+0

为什么要打印呢? Calc.exe也告诉我'-0.785'。 '2 * pi' ='6.28'。 '6.28'大于'-0.785',因此它会修改整个第一个参数。 –

+1

你为什么期望5.498?剩下的0.785当我的任何东西大于0.785时,将精确地为0.785 – sashkello

+0

@sashkello嗯,链接的问题询问C而不是Java。 (我认为这个概念是一样的) –

回答

3

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

按照JLS, Section 15.17.3

[W]这里既不是无穷大,也不是零,也不NaN被涉及,从被除数n的除法由 除数 浮点余数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

好吧,我不会去解释它比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

+0

非常感谢你,我爱接受你的答案,因为它是唯一一个真正解决我的问题,但上面的答案是实际上回答我的问题:(+1虽然:) – Xkynar