意外round()返回

  • 本文关键字:返回 round 意外 php
  • 更新时间 :
  • 英文 :


我试图使用PHP的round()函数舍入一个数字。下面是我使用的代码:

$line_item_price = 13.775;
echo round($line_item_price, 2, PHP_ROUND_HALF_DOWN);

现在,当我像这样运行代码时,我希望得到输出13.77,但是我得到的是0(或者什么都没有——还不确定是哪个)。

现在,当我删除PHP_ROUND_HALF_DOWN,我得到13.78。有人知道我哪里做错了吗?

mode参数是在5.3版本中引入的,因此它不适用于您。您必须找到一个自定义函数来做您正在寻找的事情。

您正在使用的函数在当前PHP版本中还不可用。解决这个问题的一种方法是使用floor函数。

$line_item_price = 13.775;
echo floor($line_item_price * 100) / 100;

我在这里做的也是首先将值乘以100,然后将值取底。这将为您提供精度为2的四舍五入值。然后要得到正确的值,你需要除以100。

数字100来自power(10, desired precision)

你能不能不这样做:

echo round($line_item_price, 2)

?

我不是100%确定,但我认为ROUND_HALF_DOWN等是分数,如1.5,2.5和整数。

方法如下:

$num = 13.775;
$tmp = intval($num*1000);
$dec = $tmp % 10;
if ($dec > 5) {
    $rounded = (1+intval($tmp/10))/100;
} else {
    $rounded = intval($tmp/10)/100;
}
echo $rounded,"n";

这就得到:13.77$num=13.775, 13.78$num=13.776

实际上,我有点惊讶它居然能工作,因为数字13.775在浮点数中是不能精确表示的:

$ php -r 'printf("%.40fn", 13.775);'
13.7750000000000003552713678800500929355621

事实上,round()似乎对什么是"一半"有点松懈:

$ php -r 'echo round(13.77500000000001, 2, PHP_ROUND_HALF_DOWN) . "n";'
13.77
无论如何,如果你的PHP不支持PHP_ROUND_HALF_DOWN,这里有一个简单的插件,它提供了大致相同的功能:
function round_half_down ( $num, $digits ) {
    $mul = pow( 10, $digits );
    return ceil( $num * $mul - 0.5 ) / $mul;
}

这确实像人们天真地期望的那样工作,但比round(): round_half_down(13.775, 2) == 13.77略严格,但round_half_down(13.77500000000001, 2) == 13.78。另外,作为一个奇怪的边缘情况,round_half_down(0.001, 2)返回-0。如果您不喜欢这样,您可以通过sprintf("%.{$digits}F")传递返回值以使其格式化。

最新更新