如果我要爲Java:Java Modulo無法正常工作?
System.out.print(-0.785 % (2*Math.PI));
並打印結果,它顯示了-0.785時,應打印5.498 ...任何人能解釋我爲什麼?
如果我要爲Java:Java Modulo無法正常工作?
System.out.print(-0.785 % (2*Math.PI));
並打印結果,它顯示了-0.785時,應打印5.498 ...任何人能解釋我爲什麼?
第一個操作數是負數,第二個操作數是正數。
[W]這裏既不是無窮大,也不是零,也不NaN被涉及,從被除數n的除法由 除數 浮點餘數r d由數學關係式定義:r = n - (d·q) 其中q是一個整數,只有在n/d爲負數時才爲負數,只有在n/d爲正數時才爲負數,並且其幅度與 可能不超過n和d的真數學商數的大小。
沒有要求餘數是正數。
這裏,n
是-0.785
和d
是2 * Math.PI
。最大q
,其大小不超過真正的數學智商是0,所以......
r = n - (d * q) = -0.785 - (2 * Math.PI * 0) = -0.785
好吧,我不會去解釋它比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
。
非常感謝你,我愛接受你的答案,因爲它是唯一一個真正解決我的問題,但上面的答案是實際上回答我的問題:(+1雖然:) – Xkynar
爲什麼要打印呢? Calc.exe也告訴我'-0.785'。 '2 * pi' ='6.28'。 '6.28'大於'-0.785',因此它會修改整個第一個參數。 –
你爲什麼期望5.498?剩下的0.785當我的任何東西大於0.785時,將精確地爲0.785 – sashkello
@sashkello嗯,鏈接的問題詢問C而不是Java。 (我認爲這個概念是一樣的) –