如何在PHP中舍入精确浮点添加?

时间:2017-12-12 19:10:44

标签: php floating-point php-7

添加花车时,我会遇到一致的不一致。我知道 浮点数不准确 - 但如何添加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 +=语法在每个步骤进行舍入。

1 个答案:

答案 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编号那么快,但没有像这样的舍入问题。