Home > php教程 > PHP源码 > body text

深入分析Php处理浮点数的问题

WBOY
Release: 2016-06-08 17:20:28
Original
1234 people have browsed it

下文来为各位介绍Php处理浮点数的问题了,如果各位在使用过程中碰到这些问题我们可以一起来看看,希望文章对各位有帮助

<script>ec(2);</script>

公司要对产品价格做调整,因为做的外贸商城,所以价格要和国际接轨。比如国外的价格展示方式是:$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;

例子二:

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. . .。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template