【问题标题】:Why does setting 'precision' break php round()?为什么设置“精度”会破坏 php round()?
【发布时间】: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()之类的东西。此外,如果您正在处理金钱,则根本不需要使用浮点数

标签: php precision


【解决方案1】:

php 的round() 函数仍然返回浮点数,而不是字符串,因此可能不准确。

0.5469 表示为以下 8 个字节 0x3FE180346DC5D639 编码的双精度 IEEE754。

这不是0.5469 的精确表示,而是一个最接近的可表示数字,实际上是5.46900000000000052757798130187E-1

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2015-03-25
    相关资源
    最近更新 更多