在 PHP 中四舍五入到最接近的五倍

我想要一个 php 函数,当用52调用它时返回55。

我试过 round()函数:

echo round(94, -1); // 90

它返回 90但我想要 95

谢谢。

71847 次浏览

乘以2,四舍五入到 -1,除以2。

  1. 除以5
  2. round()(或 ceil()如果你想总是围捕)
  3. 乘以5。

在步骤1和步骤3中,值5(分辨率/粒度)可以是任何值 & mash;

总结一下:

    $rounded_number = ceil( $initial_number / 5 ) * 5

这可以通过多种方式实现,具体取决于您首选的舍入约定:

1. 四舍五入到 下一个的5倍,不包括当前数字

行为: 50项产出55,52项产出55

function roundUpToAny($n,$x=5) {
return round(($n+$x/2)/$x)*$x;
}

2. 四舍五入到 最近的的5倍,包括当前的数字

行为: 50产出50,52产出55,50.25产出50

function roundUpToAny($n,$x=5) {
return (round($n)%$x === 0) ? round($n) : round(($n+$x/2)/$x)*$x;
}

3. 四舍五入为一个整数,然后四舍五入为最接近的5的倍数

行为: 50输出50,52输出55,50.25输出55

function roundUpToAny($n,$x=5) {
return (ceil($n)%$x === 0) ? ceil($n) : round(($n+$x/2)/$x)*$x;
}

总结:

$x = floor($x/5) * 5;

总结:

$x = ceil($x/5) * 5;

四舍五入到最接近的(上或下) :

$x = round($x/5) * 5;

试试我写的这个函数。

function ceilFive($number) {
$div = floor($number / 5);
$mod = $number % 5;


If ($mod > 0) $add = 5;
Else $add = 0;


return $div * 5 + $add;
}


echo ceilFive(52);
   echo $value - ($value % 5);

我知道这是一个古老的问题,但 IMHO 使用模算子是最好的方法,并远远优雅比公认的答案。

function round_up($n, $x = 5) {
$rem = $n % $x;
if ($rem < 3)
return $n - $rem;
else
return $n - $rem + $x;
}

这是我的 穆斯塔法的函数版本。这一个更复杂,但它有 对浮动编号的支持以及整数。要舍入的数字也可以在字符串中。

/**
* @desc This function will round up a number to the nearest rounding number specified.
* @param $n (Integer || Float) Required -> The original number. Ex. $n = 5.7;
* @param $x (Integer) Optional -> The nearest number to round up to. The default value is 5. Ex. $x = 3;
* @return (Integer) The original number rounded up to the nearest rounding number.
*/
function rounduptoany ($n, $x = 5) {


//If the original number is an integer and is a multiple of
//the "nearest rounding number", return it without change.
if ((intval($n) == $n) && (!is_float(intval($n) / $x))) {


return intval($n);
}
//If the original number is a float or if this integer is
//not a multiple of the "nearest rounding number", do the
//rounding up.
else {


return round(($n + $x / 2) / $x) * $x;
}
}

我尝试了 骑士穆斯塔法的功能,甚至从 普雷萨格斯的建议。它们不支持浮点数,而且来自 穆斯塔法的普雷萨格斯的解决方案在某些数字中不能正确工作。试试下面的测试数字,然后自己比较一下:

$x= 5;


$n= 200;       // D = 200     K = 200     M = 200     P = 205
$n= 205;       // D = 205     K = 205     M = 205     P = 210
$n= 200.50;    // D = 205     K = 200     M = 200.5   P = 205.5
$n= '210.50';  // D = 215     K = 210     M = 210.5   P = 215.5
$n= 201;       // D = 205     K = 205     M = 200     P = 205
$n= 202;       // D = 205     K = 205     M = 200     P = 205
$n= 203;       // D = 205     K = 205     M = 205     P = 205


** D = DrupalFever K = Knight M = Musthafa P = Praesagus

我刚刚在20分钟内写了这个函数,基于我在这里和那里发现的许多结果,我不知道它为什么工作或如何工作! !校对: D

我主要感兴趣的是将货币编号从151431.1 LBP 转换为150000.0 LBP。到目前为止,(151431.1英镑 = 约100美元)的工作非常完美,但是我尝试使它以某种方式与其他货币和数字兼容,但是不确定它是否工作正常! !

/**
* Example:
* Input = 151431.1 >> return = 150000.0
* Input = 17204.13 >> return = 17000.0
* Input = 2358.533 >> return = 2350.0
* Input = 129.2421 >> return = 125.0
* Input = 12.16434 >> return = 10.0
*
* @param     $value
* @param int $modBase
*
* @return  float
*/
private function currenciesBeautifier($value, int $modBase = 5)
{
// round the value to the nearest
$roundedValue = round($value);


// count the number of digits before the dot
$count = strlen((int)str_replace('.', '', $roundedValue));


// remove 3 to get how many zeros to add the mod base
$numberOfZeros = $count - 3;


// add the zeros to the mod base
$mod = str_pad($modBase, $numberOfZeros + 1, '0', STR_PAD_RIGHT);


// do the magic
return $roundedValue - ($roundedValue % $mod);
}

如果有什么问题,请随意修改和修复它

我是这样做的:

private function roundUpToAny(int $n, $x = 9)
{
return (floor($n / 10) * 10) + $x;
}

测试:

assert($this->roundUpToAny(0, 9) == 9);
assert($this->roundUpToAny(1, 9) == 9);
assert($this->roundUpToAny(2, 9) == 9);
assert($this->roundUpToAny(3, 9) == 9);
assert($this->roundUpToAny(4, 9) == 9);
assert($this->roundUpToAny(5, 9) == 9);
assert($this->roundUpToAny(6, 9) == 9);
assert($this->roundUpToAny(7, 9) == 9);
assert($this->roundUpToAny(8, 9) == 9);
assert($this->roundUpToAny(9, 9) == 9);
assert($this->roundUpToAny(10, 9) == 19);
assert($this->roundUpToAny(11, 9) == 19);
assert($this->roundUpToAny(12, 9) == 19);
assert($this->roundUpToAny(13, 9) == 19);
assert($this->roundUpToAny(14, 9) == 19);
assert($this->roundUpToAny(15, 9) == 19);
assert($this->roundUpToAny(16, 9) == 19);
assert($this->roundUpToAny(17, 9) == 19);
assert($this->roundUpToAny(18, 9) == 19);
assert($this->roundUpToAny(19, 9) == 19);

齿轮

MathType::roundStep(50, 5); // 50
MathType::roundStep(52, 5); // 50
MathType::roundStep(53, 5); // 55


MathType::floorStep(50, 5); // 50
MathType::floorStep(52, 5); // 50
MathType::floorStep(53, 5); // 50


MathType::ceilStep(50, 5); // 50
MathType::ceilStep(52, 5); // 55
MathType::ceilStep(53, 5); // 55

来源:

public static function roundStep($value, int $step = 1)
{
return round($value / $step) * $step;
}


public static function floorStep($value, int $step = 1)
{
return floor($value / $step) * $step;
}


public static function ceilStep($value, int $step = 1)
{
return ceil($value / $step) * $step;
}

也许你也可以考虑这一个班轮。它更快! 工程为 $num >= 0$factor > 0

$num = 52;
$factor = 55;
$roundedNum = $num + $factor - 1 - ($num + $factor - 1) % $factor;