true
true
再看下面這段代碼, 0.6+0.1+0.1+0.1+0.1 的相加結果與 1 進行比較
<?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";
}
?>
打印結果是:
float(1)
false
false
為什么這兩段代碼結果不一樣?把兩段代碼里面的 $total 分別以精度20位的形式打印出來 printf(“%.20f\n”, $total); ,結果如下:
1.00000000000000000000
0.99999999999999988898
出現這個問題是因為浮點數計算涉及精度。
關于php里面的浮點數, 官方手冊上有相關解釋
看官方手冊里面關于浮點數的提示,里面提到永遠不要比較兩個浮點數是否相等
那么有什么辦法可以比較兩個浮點數是否相等呢?
方法一、
看如下代碼示例
<?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";
}
?>
結果輸出為:
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";
}
?>
結果輸出為:
true