4

除非我误解了 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 上。

很多。

4

2 回答 2

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
于 2012-07-23T07:59:12.283 回答
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)。

于 2012-07-23T08:00:09.783 回答