php - 浮点精度问题仅影响计算吗?

标签 php floating-point

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

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

$price = 14.95;
$volume_discount = 0.3;

或者我应该将它们存储为字符串吗?

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

我知道比较 float 并用 float 进行计算可能会产生意想不到的结果,除非您使用 BC Math。但我想知道是否按原样打印出存储的值。我尝试回显 float 版本,它们按预期显示,但我想知道这是否可靠。

注意:我使用了术语预期来解释外行人的期望。正如 Eric 指出的那样,精确的十进制 float 实际上不是预期的结果。

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

$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”并将其存储在二进制浮点对象中需要浮点运算:从十进制浮点到二进制浮点的转换。因此,这是一个浮点运算,并且会产生舍入误差。

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

(您的问题断言与 float 进行比较和计算会产生意外结果。仅当您不期望操作遵守这些操作的规范时,这才是正确的。您可以通过学习规范来避免意外结果,因此了解会发生什么。)

关于php - 浮点精度问题仅影响计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929379/

相关文章:

php - wp_list_categories 显示当前帖子的类别

c++ - 如何仅使用 math.h 将 double 转换为 string?

PHP 结果与 MYSQL 多对多表和 GROUP By

php - Laravel 记住我 cookie 未设置

assembly - 无符号 64 位到 double 转换 : why this algorithm from g++

java - Java解释器浮点常量的默认数据类型

Python Decimal 模块 - 不需要的类似 float 的输出?

floating-point - 除以整数时最小化舍入误差

php - SQL仅在两个用户之间检索结果

php - 如何在我的表中搜索表单变量并在未找到时添加到表中,但如果找到则按用户指定的数量增加值?