除非我误解了round()函数在PHP中的工作方式,否则我认为它有一个错误:
示例:
运行:
$prod = 201.6 * 0.000275;
echo "No Round..: " . $prod;
echo "With Round: " . round($prod, 2, PHP_ROUND_HALF_DOWN);
PHP退货:
No Round..: 0.05544
With Round: 0.06
我的期望:
对于Round,我预计结果为0.05。这个预期结果是对的吗?
环境:
PHP 5.3.4在Windows 7 64位上运行,带有Apache 2.2.17。
知道很多。
这是正确的预期结果。
只有当值正好为一半时,PHP_ROUND_HALF_DOWN
才会发挥作用,对于您的情况,这将是0.055。
任何超过0.055的数值,例如0.0550000001,都会得到0.06。
如果你喜欢四舍五入,你应该试试floor()
。
<?php
$prod = 201.6 * 0.000275;
$prod = floor($prod * 100)/100;
echo $prod; // gives 0.05
这是因为PHP不跟踪溢出。
例如,也可以尝试
print (int) ((0.1 + 0.7) * 10);
您可能期望表达式返回8,但打印7。发生这种情况的原因是,简单算术表达式的结果在内部存储为7.999999,而不是8。当PHP将数字强制转换为int时,它只会截断小数部分。这意味着12.5%的误差!
如果需要精确计算,请改用BCMath扩展。
查看Zend PHP 5认证学习指南(PHP|architect)中的"PHP基础"一章。