PHP 5.3.4使用PHP_ROUND_HALF_DOWN模式的round()函数中可能出现的错误

时间:2012-07-23 00:36:34

标签: php rounding

除非我误解了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使用Apache 2.2.17在Windows 7 64位上运行。

很多。

2 个答案:

答案 0 :(得分:9)

这是正确的预期结果。

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

答案 1 :(得分:1)

那是因为PHP不跟踪溢出。

例如,也可以尝试

print (int) ((0.1 + 0.7) * 10);

您可能希望表达式返回8,但会打印 7 。 发生这种情况是因为简单算术表达式的结果在内部存储为 7.999999 而不是 8 ,当PHP将数字转换为int时,它只是截断小数部分。这意味着12.5%的错误!

如果您需要精确计算,请使用BCMath扩展名。

在“PHP基础知识”一章中查看 Zend PHP 5认证学习指南(php | architect)。