PHP 5.3.4使用PHP_round_HALF_DOWN模式的round()函数中可能存在错误


PHP 5.3.4 possible bug in round() function using PHP_ROUND_HALF_DOWN mode

除非我误解了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基础"一章。