意外的round()返回

时间:2011-10-10 14:56:40

标签: 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。谁知道我在这里做错了什么?看起来这应该是正常的。

5 个答案:

答案 0 :(得分:3)

模式参数是在5.3版本中引入的,因此它不适合您。你必须找到一个自定义函数来做你想要的。

答案 1 :(得分:1)

您正在使用当前版本的PHP尚未提供的功能。解决此问题的一种方法是使用floor函数。

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

我在这里做的是先将值乘以100,然后将值置于最低值。这将为您提供一个向下舍入的值,精度为2.然后,要获得正确的值,您需要使用100。

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

答案 2 :(得分:0)

你能不能这样做:

echo round($line_item_price, 2)

我不是100%肯定,但我认为ROUND_HALF_DOWN等适用于1.5,2.5和整数等分数。

答案 3 :(得分:0)

这是一种方法:

$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.77513.78 $num=13.776

答案 4 :(得分:0)

实际上,我对它的工作原理感到惊讶,因为数字13.775在浮点数上并不完全可以表示:

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

事实上,似乎round()对于什么算作“一半”有点松懈:

$ php -r 'echo round(13.77500000000001, 2, PHP_ROUND_HALF_DOWN) . "\n";'
13.77

无论如何,如果你的PHP不支持PHP_ROUND_HALF_DOWN,这里有一个简单的kluge,它提供了大致相同的功能:

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")传递返回值来很好地格式化它。