如何将数字四舍五入到最近的十位?

111

如何在php中将数字四舍五入到最接近的10个数字?

假设我有数字23,我应该使用什么代码将其四舍五入到30


54
那不是最接近的十吗? - Rowland Shaw
1
好的,四舍五入到1个有效数字!哈哈 - tarnfeld
4
公平起见,标题中写着“将数字四舍五入至最接近的10”,尽管正文中写着“四舍五入”……我相当确定他想要始终将数字向上舍入至下一个10的倍数。 - Aaron Wallentine
1
向10的幂次方四舍五入,https://dev59.com/2qHia4cB1Zd3GeqPXK6n - LF00
16个回答

251

floor()会向下取整。

ceil()会向上取整。

round()默认情况下会四舍五入到最近的整数。

将数值除以10,进行向上取整,再乘以10以减少有效数字。

$number = ceil($input / 10) * 10;

编辑:我一直都这样做,但TallGreenTree的回答更清晰。


4
TallGreenTree的答案并不总是向上取整。使用ceil()函数得出的答案最为准确。 - Brandon
1
TallGreenTree的回答支持使用round()函数的第三个参数(mode)进行四舍五入。round($input,-1, PHP_ROUND_HALF_UP) - Daren Schwenke
5
@DarenSchwenke,你所认为的第三个参数并不能很好地起作用,它只控制了正好处于两个区间中间时的情况。(15,-1,PHP_ROUND_HALF_UP);// 20(14,-1,PHP_ROUND_HALF_UP);// 10 - Arth

179

11
他们是否有理由认为问话者在问题中两次使用“舍入到最接近的十位”这个术语时是指舍入到最接近的10? - ceejayoz
这个回答是在提问者澄清之前发布的。我只是发现他在问题中没有正确地四舍五入。 - Will Barrett
12
TallGreenTree 是正确的。您可以使用第三个参数设置舍入模式:"PHP_ROUND_HALF_UP","PHP_ROUND_HALF_DOWN","PHP_ROUND_HALF_EVEN" 或 "PHP_ROUND_HALF_ODD" 中的一个。 - d-_-b
13
这样做得不到正确的结果。23 会变成 20 而不是 30,因为它总是会四舍五入到最近的十位。而且四舍五入模式也无法解决问题,因为它只会在小数点后面的一半进行四舍五入。 - Timo002
避免使用经典的 round( $x / $y ) * $y 解决方案,这样可以节省宝贵的时钟周期。不使用除法和乘法可以达到此目的。 - stevendesu
1
很遗憾,ceil()和floor()函数目前还没有精度参数。 - squarecandy

20

我实际上在寻找一种可以将数字四舍五入到最接近的变量的函数,并且这个页面一直出现在我的搜索结果中。因此,当我最终编写了这个函数时,我想在这里发布它,以便其他人可以找到。

该函数将四舍五入到最接近的变量:

function roundToTheNearestAnything($value, $roundTo)
{
    $mod = $value%$roundTo;
    return $value+($mod<($roundTo/2)?-$mod:$roundTo-$mod);
}

这段代码:

echo roundToTheNearestAnything(1234, 10).'<br>';
echo roundToTheNearestAnything(1234, 5).'<br>';
echo roundToTheNearestAnything(1234, 15).'<br>';
echo roundToTheNearestAnything(1234, 167).'<br>';

将输出:

1230
1235
1230
1169

1
Kenny,你是最棒的。我只希望有一个图形表示,以便我确定它在100%的情况下给出了预期结果。我想我需要进行一些测试。 - Slava
有没有办法修改这段代码,添加第三个参数并设置舍入模式为HALF_UP / HALF_DOWN? - Slava
无法处理数字:2560.9999999999995。 - Raf A.

12

这个问题有很多答案,可能所有的答案都能给你想要的答案。但是就像@TallGreenTree所提到的,这里有一个函数可以解决这个问题。

然而,@TallGreenTree的答案存在一个问题,它不能向上取整,而是向最近的10取整。为了解决这个问题,你需要在你的数字上添加+5来进行向上取整。如果您想向下取整,请使用-5

所以在代码中:

round($num + 5, -1);

无法使用四舍五入模式向上舍入,因为该模式只能将小数向上舍入,而不能将整数向上舍入。

如果您想要向上舍入到最接近的100,则应该使用+50


这对于非十进制数字无效。10变成20。 - Luciano

7

3
我们可以通过四舍五入来“欺骗”。
$rounded = round($roundee / 10) * 10;

我们也可以避免使用浮点数除法,通过使用
function roundToTen($roundee)
{
  $r = $roundee % 10;
  return ($r <= 5) : $roundee - $r : $roundee + (10 - $r);
}

编辑:我不知道(网站上也没有很好的文档记录)round现在支持“负”精度,因此您可以更轻松地使用它。

$round = round($roundee, -1);

再次编辑:如果您总是想向上舍入,可以尝试使用

function roundUpToTen($roundee)
{
  $r = $roundee % 10;
  if ($r == 0)
    return $roundee;
  return $roundee + 10 - $r;    
}

嗨,这个完美地运作了 - 针对那个问题,我如何向上取整?比如23变成30? - tarnfeld

3
"向最接近的10取整,应如下所示"
$number = ceil($input * 0.1)/0.1 ;

很棒的答案。比其他方法简单得多。如果你想向下舍入到最近的10,只需将 ceil 更改为 floor - Gavin

2
$value = 23;
$rounded_value = $value - ($value % 10 - 10);
//$rounded_value is now 30

2
我想将最高位上的数字向上舍入到下一个数字(这个位有没有特定的名称?),因此我编写了以下函数(使用php):
//Get the max value to use in a graph scale axis, 
//given the max value in the graph
function getMaxScale($maxVal) {
    $maxInt = ceil($maxVal);
    $numDigits = strlen((string)$maxInt)-1; //this makes 2150->3000 instead of 10000
    $dividend = pow(10,$numDigits);
    $maxScale= ceil($maxInt/ $dividend) * $dividend;
    return $maxScale;
}

谢谢,这正是我一直在寻找的。如果数字是54000,则四舍五入到60000,如果是5600,则四舍五入到6000。 - RoshJ
不客气,@RoshJ,我很高兴能帮到你! - Robert

2

尝试使用

round(23, -1);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接