添加花车时,我会遇到一致的不一致。我知道 浮点数不准确 - 但如何添加1.95到1.95并最终得3.9 而不是3.89999999?舍入不起作用。 number_format可以修复最终版 结果,但不是在加入期间。
$amountPaid = 0;
var_export($amountPaid); echo "<br>\n";
$amountPaid = $amountPaid + 1.95;
var_export($amountPaid); echo "<br>\n";
$amountPaid = $amountPaid + 1.95;
var_export($amountPaid); echo "<br>\n";
$amountPaid = $amountPaid + 1.95;
var_export($amountPaid); echo "<br>\n";
$amountPaid = $amountPaid + 1.95;
var_export($amountPaid); echo "<br>\n";
$amountPaid = $amountPaid + 1.95;
var_export($amountPaid); echo "<br>\n";
$amountPaid = $amountPaid + 1.95;
var_export($amountPaid); echo "<br>\n";
echo '<h1>Rounding does not work</h1>';
var_export(round($amountPaid,1)); echo "<br>\n";
这是输出:
0
1.95
3.8999999999999999
5.8499999999999996
7.7999999999999998
9.75
11.699999999999999
Rounding does not work
11.699999999999999
我还尝试使用number_format
(但返回一个字符串)并使用$amountPaid +=
语法在每个步骤进行舍入。
答案 0 :(得分:4)
您的问题是name
从版本5.4.22看起来var_export使用了 serialize_precision ini设置,而不是使用的精度 用于浮点数的正常输出。结果是因为 例如版本5.4.22将输出var_export(1.1) 1.1000000000000001(17是默认精度值),而不是之前的1.1。
http://php.net/manual/de/function.var-export.php#113770
除此之外,我应该提一下,var_export
setting在PHP 7.1中更改为serialize_precision
,您的代码运行正常。
因此,不要使用-1
,只需使用var_export
打印值,或使用echo
转储值。
在大多数情况下,如果您进行计算,您的代码将正常工作,如果您打印它,只需将值四舍五入。如果您需要更高的准确度,您应该使用大型库,如bc math。它们没有IEEE编号那么快,但没有像这样的舍入问题。