任何人都可以用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
Run Code Online (Sandbox Code Playgroud)
为什么$ num_int2是64?
感谢帮助.
Joh*_*nde 15
从我为Authorize.Net写的一篇文章(在你的特定情况下,$num_int1即使它看起来像一个整数,也是一个浮点数):
一加一等于二,对吗?怎么样.2加1.4倍10?那等于16,对吧?如果您正在使用PHP(或大多数其他编程语言)进行数学计算,那就不是了:
echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
Run Code Online (Sandbox Code Playgroud)
这是由于内部如何处理浮点数.它们以固定的小数位数表示,并且可能导致数字不会像您期望的那样相加.在内部我们的.2加上1.4倍10的例子计算到大约15.9999999998左右.使用不必像百分比那样精确的数字时,这种数学运算很好.但是,当处理金钱时,精确度就像一分钱或一美元在这里丢失或在那里很快就会增加,没有人喜欢在任何缺钱的短期内.
BC数学解决方案
幸运的是,PHP提供了BC Math扩展,"对于任意精度数学,PHP提供了二进制计算器,它支持任何大小和精度的数字,表示为字符串." 换句话说,您可以使用此扩展名使用货币值进行精确数学运算.在BC数学扩展包含函数 s表示让您精确,包括执行最常见的操作此外,减法,乘法和除法.
一个更好的例子
这是与上面相同的例子,但是使用bcadd()函数为我们做数学运算.它需要三个参数.前两个是我们想要添加的值,第三个是我们希望精确到的小数位数.由于我们正在处理金钱,我们将精确度设置为两位小数.
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |