除非我误解了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位上运行。
很多。
答案 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)。