6

可能重复:
PHP 数学精度
在 PHP 中处理货币值的最佳实践?

我真的希望有人能提供帮助。在这个问题上,我一直在用头撞砖墙。

情况如下:我有一个结帐,计算折扣后的小计为 -11.50 英镑。然后加上 11.50 英镑的运费,恕我直言,应该等于 0 英镑。

然而,当计算运行时,它返回一个浮点数 2.8421709430404E-14

在我的调试工作中,我这样做了:

var_dump(
    $build['total'], // float(-11.5)
    $build['delivery'], // float(11.5)
    (($build['total'])+($build['delivery'])) // float(2.8421709430404E-14)
);

但是,当我进行静态计算时:

var_dump((-11.5 + 11.5)); // float(0)

有任何想法吗?

4

1 回答 1

8

2.8421709430404E-14 是 PHP 可以输出的最接近(但不等于)零的数字。它不完全是 0 的原因在于浮点数的定义——它们从来都不是完全精确的。

如果您需要处理还包含分数点的合理信息,我建议您通过乘以分数将其变为整数。

所以 100.54 美元变成了 10054。在完成所有计算之后,您可以再除以分数。

例子:

$build['total'] = -11.5;
$build['delivery'] = 11.5;

var_dump(
    $build['total'], // float(-11.5)
    $build['delivery'], // float(11.5)
    (int)($build['total']*1000)+(int)($build['delivery']*1000) // int(0)
    (int)(round($build['total'], 4)*1000)+(int)(round($build['delivery'], 4)*1000) // int(0)
);
于 2012-08-16T15:22:56.103 回答