2014-04-01 35 views
1
float x=1.1; 

if(x==1.1) //This condition evaluates to false, since a float is being compared to a double. 

float x=1.25; 

if(x==1.25) //This condition evaluates to true, since 1.25 is not a recurring binary number. 

但是,我想知道floatdouble實際上是如何比較的?浮動和雙重比較如何?

是否將float提升爲double(通過加上前導0)然後進行比較?

+1

呃......通過添加前導零來提升?全部採取掩護... – DevSolar

回答

6

首先,您絕對不應該爲浮點數進行比較,因爲它具有很高的失敗風險。一如既往,請參閱WECSSKAFPA

計算數字之間的絕對距離並將其與某個閾值進行比較會更好。

要回答你的第二個問題,是的,float被提升爲double,但當然不能添加從float開始的實際數字。此外,促銷活動不會通過「添加前導0」發生,詳情請參閱floatdouble的二進制表示。

+0

你能告訴我你的意思嗎?計算數字之間的絕對距離並將其與某個閾值進行比較? 此外,如果不是通過添加前導0,浮動如何晉升爲雙? – user2684198

+0

取決於你正在處理的是什麼,商可能比差異更好:'x = 9.98E + 42; y = 9.99E + 42;' – pmg

+0

@ user2684198:爲了比較float a和float b,計算差異'diff =(ab)',取其絕對值('if(diff <0)diff = -diff; '或者調用某個函數來做到這一點),然後比較diff是否比'0.0001'更小。那是因爲浮點變量的性質無法精確計算。應該導致10的東西可能是9.9999999或10.000001 ...如果你準確地比較到10,那將是不相等的。這就是這種複雜的比較方法的原因。 – deviantfan

0

在這兩種情況下,float都被提升爲double。在其中一種情況下,您得到的結果是true - 數字完全由計算機表示。在另一種情況下,你得到false,因爲計算機沒有完全代表它。