2012-09-27 157 views
2

可能重複:
Is double Multiplication Broken in .NET?
PHP unexpected result of float to int type cast錯誤的計算?

echo (int) ((0.1+0.7) * 10); 

給我回答7而不是8

echo (int) ((0.1+0.8) * 10); 

給出答案9這是正確的

怎麼了?有誰能夠解釋

感謝名單, -Navi

+0

http://stackoverflow.com/questions/3385685/php-unexpected-result-of-float-to-int-type-cast – h0tw1r3

+0

是的,我知道它說.Net,但它是完全相同的問題。 – asawyer

回答

1

這是正常的 - 有一個叫精度浮點數工作時的事情。它存在於大多數現代語言中。看到這裏:http://www.mredkj.com/javascript/nfbasic2.html欲瞭解更多信息。

((0.1+0.7) * 10)是大概就像7.9999999(int) 7.9999999 = 7

在另一方面((0.1+0.8) * 10)可能是9.00000001(int)9.00000001 = 9

浮點數有精度的限制。雖然它取決於系統,但PHP通常使用IEEE 754雙精度格式,由於四捨五入的順序爲1.11e-16,因此會產生最大相對誤差。非基本的算術運算可能會導致更大的錯誤,當然,當多個運算複合時,必須考慮錯誤傳播。

此外,有理數是在基座10,如0.1或0.7精確表示作爲 浮點數,沒有一個 精確表示作爲浮點數在基座2,其是 內部使用,不管尾數的大小。因此,他們 不能被轉換成其內部的二進制對應,沒有一個精度的小損失。這可能導致混亂的結果: 例如,地板((0.1 + 0.7)* 10)通常會返回7代替 預期8,由於內部表示將會像 7.9999999999999991118 ....

因此,不要將浮點數結果信任到最後一位,也不要直接比較浮點數的相等性。如果精度要求更高,則可以使用任意精度數學函數和gmp函數。

來源:http://php.net/manual/en/language.types.float.php

+0

爲什麼0.1 + 0.7是7.9999999而不是0.8? –

+0

查看我的更新回答 –

+0

我想我知道但忘了,但你的解釋再次提醒我。 thanx :-) –

2

嘗試

echo (float) ((0.1+0.7) * 10); 
0

使用float

echo (float) ((0.1+0.7) * 10); 

它會給你完美的ANS

0

嘗試

echo (int) round(((0.1+0.7) * 10)); 

這應該補償浮點計算錯誤。