浮点精度问题是否只影响计算



我有一些价格和折扣金额,它们将存储在PHP代码的配置变量中。我想知道是否需要将它们存储为字符串。

例如,执行以下操作安全吗?

$price = 14.95;
$volume_discount = 0.3;

还是应该将它们存储为字符串?

$price = '14.95';
$volume_discount = '0.3';

我知道比较浮点数和用浮点数进行计算会产生意想不到的结果,除非你使用BC数学。但我想知道是否按原样打印存储的值。我试着呼应float版本,它们按预期显示,但我想这是否可靠。

注意:我用期望这个词来解释外行的期望。正如Eric所指出的,精确的十进制浮点数实际上是,而不是预期的结果。

编辑:我目前关心的代码,检查数量并确定是否应该应用折扣。然后进行以下计算:

$price -= round($price * $volume_discount, 2);

我通常使用number_format来格式化价格以供显示,但我为测试注释了格式。到目前为止,无论价格或折扣值如何,PHP都给了我想要的结果。然而,JavaScript并不总是给我想要的结果。这就是我再次查看PHP代码的原因。

显然,我会调整JavaScript,因为这就是错误出现的地方,但我试图决定是否需要重构我的PHP代码。

向我说明这个问题的数字是149.95*0.3。PHP显示44.985,JavaScript显示44.98499999999999。所以,即使四舍五入到小数点后两位,我也会得到不同的数字。

解释十进制数字"14.95"并将其存储在二进制浮点对象中需要浮点运算:从十进制到二进制浮点的转换。因此,这是一个浮点运算,会出现舍入误差。

当编译器或解释器解释源文本时,或者在运行时,这种转换可能会发生,但确实会发生,并且会出现舍入错误。

(您的问题断言,与浮点数进行比较和计算会产生意外结果。只有当您不希望操作遵守这些操作的规范时,情况才是正确的。您可以通过学习规范,从而学习预期结果来避免意外结果。)

最新更新