我想要一个php函数,当用52调用它时返回55。
我尝试了round()
功能:
echo round(94, -1); // 90
它返回 90 ,但我想 95 。
感谢。
答案 0 :(得分:127)
这可以通过多种方式实现,具体取决于您的首选舍入约定:
行为:50输出55,52输出55
function roundUpToAny($n,$x=5) {
return round(($n+$x/2)/$x)*$x;
}
行为: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;
}
行为: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;
}
答案 1 :(得分:66)
round()
(或ceil()
,如果您想要总结)值5(分辨率/粒度)可以是任何值 - 在步骤1和3中都替换它
答案 2 :(得分:52)
向下舍入:
$x = floor($x/5) * 5;
总结:
$x = ceil($x/5) * 5;
舍入到最接近(向上或向下):
$x = round($x/5) * 5;
答案 3 :(得分:3)
尝试我写的这个小功能。
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);
答案 4 :(得分:3)
echo $value - ($value % 5);
我知道这是一个老问题,但恕我直言使用模数运算符是最好的方法,并且比接受的答案更优雅。
答案 5 :(得分:3)
来自Gears库
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;
}
答案 6 :(得分:1)
乘以2,舍入为-1,除以2。
答案 7 :(得分:1)
这是我的Musthafa's函数版本。这个更复杂,但它支持Float数字以及整数。要舍入的数字也可以是字符串。
/**
* @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;
}
}
我尝试了Knight,Musthafa中的功能,甚至是Praesagus的建议。他们不支持Float数字和来自Musthafa's&的解决方案。 Praesagus在某些数字中无法正常工作。请尝试以下测试编号并自行进行比较:
$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
答案 8 :(得分:1)
我这样做:
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);
答案 9 :(得分:0)
function round_up($n, $x = 5) {
$rem = $n % $x;
if ($rem < 3)
return $n - $rem;
else
return $n - $rem + $x;
}
答案 10 :(得分:0)
我刚刚在20分钟内编写了这个功能,基于我在这里和那里找到的许多结果,我不知道它为什么会起作用或者它是如何工作的! :d
我主要想将货币数量从这个151431.1 LBP转换为150000.0 LBP。 (151431.1 LBP == ~100 USD)到目前为止工作得很好,但我试图让它与其他货币和数字兼容,但不确定它是否正常工作!!
/**
* 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);
}
如果出现任何问题,请随意修改并修复
答案 11 :(得分:0)
也许您也可以考虑使用这种衬板。更快!适用于$num >= 0
和$factor > 0
。
$num = 52;
$factor = 55;
$roundedNum = $num + $factor - 1 - ($num + $factor - 1) % $factor;