主页 M

php处理浮点数精度

2015-08-05 网页编程网 网页编程网

公司要对产品价格做调整,因为做的外贸商城,所以价格要和国际接轨。比如国外的价格展示方式是:$35标识为$35.00; $56.2标识为:$56.20。

通过sprintf(“%1\$.2f”,$price)解决了上面的需求,但是新的问题出现,有价格为0的会处理为0.00。

通过empty()和判断是否相等,无法识别符点数0.00;通过百度总结了下面处理浮点数的方法。

浮点数0.00的处理

通过intval转换为整形intval(0.00) 变为0,只针对0.00使用intval处理;可以看先的例子你就明白了。

例子1:

$n=”19.99″;
print intval($n*100); //输出的结构是1998,而不是1999;
print intval(strval($n*100));//这个输出的才是1999;

例子2:

echo floor((0.1+0.7)*10);//输出的是7,而不是8;
echo floor(strval((0.1+0.7)*10));//这个才是8;

在php中一些简单的浮点数据在内部不能以精确的二进制来表示的。这和计算机的数据表示相关,即:不可能以有限的二进制来表示某些十进制的分数。永远不要相信浮点数的结果精确到了最后一位,也永远不要比较两个浮点数是否相等。

上面的2个例子,总结出php处理浮点数的方式是将其转成字符串, 可以通过strval或者使用printf/sprintf将浮点数转成字符串。

浮点数精度

显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。

这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的1/3变成了0.3333333。

阅读原文
阅读 4240
123 显示电脑版