PHP浮点数引起的四舍五入问题

同事在开发中,遇到一个浮点数问题,过来问我,问题如下:

$a = 0.705;
$b = 20.795;
$c = 20.715;
$d = 20.745;

echo sprintf('%0.2f', $a) . '<br>'; //0.70
echo sprintf('%0.2f', $b) . '<br>'; //20.80
echo sprintf('%0.2f', $c) . '<br>'; //20.71
echo sprintf('%0.2f', $d) . '<br>'; //20.75

所有变量都取2位小数,从结果得知:$b 和 $d 四舍五入了,$a 和 $c 却没有。

同样第三位小数都是5,怎么会出现这种情况呢?

同过查阅文档,调试

echo sprintf('%0.20f', $a). '<br>'; // 0.70499999999999996003
echo sprintf('%0.20f', $b). '<br>'; // 20.79500000000000170530
echo sprintf('%0.20f', $c). '<br>'; // 20.71499999999999985789
echo sprintf('%0.20f', $d). '<br>'; // 20.74500000000000099476

显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。

posted @ 2016-05-04 19:26  cqingt  阅读(1123)  评论(0编辑  收藏  举报