【发布时间】:2012-08-15 23:26:37
【问题描述】:
我刚刚“修复”了以下 PHP 行中的一个错误:
$value = 1091.09; // the failing test case
$prop = sprintf('%013d', $value * 100);
通过添加这些行:
$cents = $value * 100; // $cents is now 109109
$cents = round($cents, 2); // $cents is still 109109
$prop = sprintf('%013d', $cents);
前一个块的结果是"0000000109108",而第二个块的结果是"0000000109109",这是正确的。
请注意,我添加了这两行以便能够分别查看调试器中的每个步骤。如果我跳过第一行,它也可以工作,因此写:
$cents = round($value * 100, 2); // $cents is now 109109
$prop = sprintf('%013d', $cents);
因此,显然,round() 函数做了一些值不可见的事情,使其与sprintf() 的工作方式不同。这是什么?
如果这是一种合适的语言,我可能通过查看数据类型就知道了。在这里,我什至不知道它们是什么。
【问题讨论】:
-
"浮点数的精度有限。虽然它取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于四舍五入,它会给出最大的相对误差,大约为 1.11e- 16. 非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。”
标签: php floating-point arithmetic-expressions