2013-09-24 48 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