php 浮點數計算比較及取整不許確。舉例:
$a = 0.2+0.7;
$b = 0.9;
var_dump($a == $b); //輸出的結果爲bool(false)
PHP 官方手冊說明:顯然簡單的十進制分數如 0.2 不能在不丟失一點點精度的狀況下轉換爲內部二 進制的格式。
printf(「%0.20f」, $a); //輸出的結果爲0.89999999999999991118
printf(「%0.20f」, $b); //輸出的結果爲0.90000000000000002220
根據結果說明,做爲浮點型數據,其精度已經損失了一部分,達不到徹底精確。因此永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。
須要說明的是,這不是 PHP 的 問題,而是計算機內部處理浮點數的問題!在 C、JAVA 等語言中也會遇到一樣的問題。
解決方法:須要將其控制在咱們須要的精度範圍內再行比較。
所以使用 bcadd() 函數 來對浮點數想加並進行精度轉換(爲字符串):
var_dump(bcadd(0.2,0.7,1) == 0.9); // 輸出的結果爲bool(true)
也能夠使用round() 函數是按照指定的精度進行四捨五入:
var_dump(round(0.2+0.7,2) == 0.9);// 輸出的結果爲bool(true)