true
true
再看下面這段代碼, 0.6+0.1+0.1+0.1+0.1 的相加結(jié)果與 1 進(jìn)行比較
<?php $a = 0.6; $b = 0.1; $c = 0.1; $d = 0.1; $e = 0.1; $total = $a + $b + $c + $d + $e; var_dump($total); if (1 == $total) { echo "true"; } else { echo "false"; } echo "\n"; if (1.0 == $total) { echo "true"; } else { echo "false"; } ?>
打印結(jié)果是:
float(1)
false
false
為什么這兩段代碼結(jié)果不一樣?把兩段代碼里面的 $total 分別以精度20位的形式打印出來(lái) printf(“%.20f\n”, $total); ,結(jié)果如下:
1.00000000000000000000
0.99999999999999988898
出現(xiàn)這個(gè)問(wèn)題是因?yàn)楦↑c(diǎn)數(shù)計(jì)算涉及精度。
關(guān)于php里面的浮點(diǎn)數(shù), 官方手冊(cè)上有相關(guān)解釋
看官方手冊(cè)里面關(guān)于浮點(diǎn)數(shù)的提示,里面提到永遠(yuǎn)不要比較兩個(gè)浮點(diǎn)數(shù)是否相等
那么有什么辦法可以比較兩個(gè)浮點(diǎn)數(shù)是否相等呢?
方法一、
看如下代碼示例
<?php $a = 0.6; $b = 0.1; $c = 0.1; $d = 0.1; $e = 0.1; $epsilon = 0.00001; $total = $a + $b + $c + $d + $e; if(abs($total-1) < $epsilon) { echo "true"; } else { echo "false"; } echo "\n"; if(abs($total-1.0) < $epsilon) { echo "true"; } else { echo "false"; } ?>
結(jié)果輸出為:
true
true
方法二、
<?php $a = 0.6; $b = 0.1; $c = 0.1; $d = 0.1; $e = 0.1; $total = $a + $b + $c + $d + $e; if(1.0 == round($total, 5)) { echo "true"; } else { echo "false"; } ?>
結(jié)果輸出為:
true