同事在开发中,遇到一个浮点数问题,过来问我,问题如下:
$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 等语言中也会遇到同样的问题。