2016-08-24 73 views
5

我知道雙不應由==操作符直接比較,但怎麼樣,如果我定義的初始值0.0例如:如果double a = 0.0,我可以直接比較a * b == 0嗎?

double a=0.0; 
double b= 
. 
. 
. 

如果沒有被修改,確實A * B == 0總是真正?

+0

您是否試過編寫測試(jUnit)並驗證自己? –

+0

也許相關:http://stackoverflow.com/questions/21005444/double-comparison-to-zero-special-case?rq=1 FWIW,乘以0將使結果*精確* 0(沒有舍入錯誤或imprecisions )。 – Thilo

回答

4

我知道雙不應由==操作符直接

也就是說,如果你不知道你有多麼陳述或舍入誤差必須是唯一真正的進行比較。什麼不該做的一個典型的例子是

0.1 + 0.2 == 0.3 // false :(

但是,如果你使用四捨五入喜歡

if (round4(0.1 + 0.2) == 0.3) // true 

Chronicle Core's Maths

public static double round4(double d) { 
    final double factor = 1e4; 
    return d > WHOLE_NUMBER/factor || d < -WHOLE_NUMBER/factor ? d : 
      (long) (d < 0 ? d * factor - 0.5 : d * factor + 0.5)/factor; 
} 

如果沒有被修改,做了* b == 0總是正確的?

它是有限數字。對於無窮大和NaN,您將獲得NaN,這不等於任何東西。

4

0.0相乘將導致0.0(確切地說,沒有舍入誤差或其他不精確性 - 除非涉及無窮大或NaN之類的東西)。

但是,如果在任意操作後最後出現0.0或接近0.0的東西,則無法確定它是否真的(數學上)爲0,並且應該使用epsilon。

相關問題