我正在尝试使用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。谁知道我在这里做错了什么?看起来这应该是正常的。
答案 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.775
和13.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")
传递返回值来很好地格式化它。