我知道雙不應由==操作符直接比較,但怎麼樣,如果我定義的初始值0.0例如:如果double a = 0.0,我可以直接比較a * b == 0嗎?
double a=0.0;
double b=
.
.
.
如果沒有被修改,確實A * B == 0總是真正?
我知道雙不應由==操作符直接比較,但怎麼樣,如果我定義的初始值0.0例如:如果double a = 0.0,我可以直接比較a * b == 0嗎?
double a=0.0;
double b=
.
.
.
如果沒有被修改,確實A * B == 0總是真正?
我知道雙不應由==操作符直接
也就是說,如果你不知道你有多麼陳述或舍入誤差必須是唯一真正的進行比較。什麼不該做的一個典型的例子是
0.1 + 0.2 == 0.3 // false :(
但是,如果你使用四捨五入喜歡
if (round4(0.1 + 0.2) == 0.3) // true
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
,這不等於任何東西。
與0.0
相乘將導致0.0
(確切地說,沒有舍入誤差或其他不精確性 - 除非涉及無窮大或NaN之類的東西)。
但是,如果在任意操作後最後出現0.0
或接近0.0
的東西,則無法確定它是否真的(數學上)爲0,並且應該使用epsilon。
您是否試過編寫測試(jUnit)並驗證自己? –
也許相關:http://stackoverflow.com/questions/21005444/double-comparison-to-zero-special-case?rq=1 FWIW,乘以0將使結果*精確* 0(沒有舍入錯誤或imprecisions )。 – Thilo