【发布时间】:2017-04-25 00:55:39
【问题描述】:
最近遇到一种情况,我正在使用具有 php.ini 文件的服务器:
precision = 16
默认值为 14,这似乎是无害的。不幸的是,它导致了这个:
// ini_set('precision', 16);
echo round((20.12 / 36.79),4);
结果: 0.5469000000000001
嗯? round() 不应该在这里处理浮点精度问题吗?
【问题讨论】:
-
错误,什么..?能说下php版本吗?
-
似乎无关紧要,因为这是一个浮点精度问题。测试和相同的结果 php 5.3 - php 7.0
-
啊,我明白了,看起来我们错过了截断与舍入的概念......好吧some discussion on floating points
-
我对这个概念很熟悉——我只是(错误地)假设
round()会在这里处理业务。我想只要它返回一个浮点数,它就会容易出现这种行为。 -
round()返回一个浮点数,如果您将显示精度调高到足以看到它,该浮点数仍然存在误差。如果你想格式化一个数字来显示,那么你需要使用sprintf()或number_format()之类的东西。此外,如果您正在处理金钱,则根本不需要使用浮点数。