前兩天在看PHP的時候看到一本書中提到在由浮點型轉換成整形的時候需要注意,因為由于計算機存儲的問題會導緻某些出人意料的結果。我突然想起來在原來看Java 的時候也有相同的問題,但是以前沒有仔細想。既然這裡也提到了,就應該好好總結下。以下是我用的例子:
在PHP/Java/C++/C#下我都嘗試着運作了下面計算的結果:
(int)(0.1*10) (int)((0.1+0.7)*10) (int)((0.1+0.9)*10)
結果得到的結果都是:1 7 10
對于這個答案我也隻能解釋第二個的答案,因為在計算機的内部,所有的資訊都是以二進制存儲的,是以在計算機中不能精确的表示0.1,而隻能表示成0.099999....。是以0.1+0.7等于0.799999....,乘以10就是7.999999....,而去整就是截取小數點後的字段,是以得到的答案是7。但是如果以這個理由來解釋第一和第三個就又解釋不清楚了。
這個問題問了好些人,也沒有給出具體的答案。我估計要徹底了解這個問題,需要從計算機的運算原理入手。其實能否正确了解這個問題的原理并不重要,隻要我們知道有這種事情,在程式設計的時候小心些就好了。盡量避免這種運算,就像永遠不要比較浮點數是否相等的道理一樣。