3

谁能用 PHP 解释下面的输出?

$num1 = (1.65 - 1.00);
echo "<br><br>num1 = " . $num1;   // Output: int = 0.65

$num_int1 = $num1 * 100;
echo "<br><br>int = " . $num_int1;   // Output: int = 65

$num_int2 = (int) $num_int1;
echo "<br><br>int = " . $num_int2;   // Output: int = 64

为什么 $num_int2 是 64?

感谢帮助。

4

1 回答 1

15

我为 Authorize.Net 写的一篇文章中(在你的具体情况下$num_int1是一个浮点数,即使它看起来像一个整数):

一加一等于二,对吧?0.2 加上 1.4 乘以 10 怎么样?那等于16,对吧?如果您使用 PHP(或大多数其他编程语言)进行数学运算,则不会:

echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!

这是由于浮点数是如何在内部处理的。它们以固定的小数位数表示,并且可能导致数字加起来不像您期望的那样。在内部,我们的 0.2 加 1.4 乘以 10 示例计算大约为 15.9999999998 左右。当处理不需要像百分比这样精确的数字时,这种数学方法很好。但是,当处理货币精度问题时,这里或那里丢失的一分钱或一美元很快就会加起来,没有人喜欢在任何丢失的钱中亏本。

BC 数学解决方案

幸运的是,PHP 提供了BC Math 扩展,“用于任意精度数学 PHP 提供了二进制计算器,它支持任何大小和精度的数字,以字符串表示。” 换句话说,您可以使用此扩展对货币价值进行精确的数学运算。BC Math 扩展包含允许您精确执行最常见操作的函数,包括加法减法乘法除法

一个更好的例子

这是与上面相同的示例,但使用 bcadd() 函数为我们进行数学运算。它需要三个参数。前两个是我们希望添加的值,第三个是我们希望精确到的小数位数。由于我们使用的是金钱,我们将精度设置为小数点后两位。

echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.
于 2012-05-11T00:41:08.940 回答