PHP에서 5의 가장 가까운 배수까지 반올림
52로 호출하면 55가 반환되는 php 함수를 원합니다.
제가 한번 해봤는데round()
기능:
echo round(94, -1); // 90
90을 돌려주는데 95를 원합니다.
감사해요.
선호하는 라운딩 규칙에 따라 여러 가지 방법으로 이 작업을 수행할 수 있습니다.
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;
}
- 5로 나누다
round()
(또는ceil()
항상 반올림하고 싶은 경우)- 5를 곱하다.
값 5(해상도/입도)는 어떤 것이든 상관없습니다.스텝 1과 3에서 모두 대체됩니다.
요약하면 다음과 같습니다.
$rounded_number = ceil( $initial_number / 5 ) * 5
반올림:
$x = floor($x/5) * 5;
반올림:
$x = ceil($x/5) * 5;
가장 가까운 곳으로 올림(위 또는 아래):
$x = round($x/5) * 5;
echo $value - ($value % 5);
오래된 질문인 것은 알지만 IMHO는 계수 연산자를 사용하는 것이 가장 좋은 방법이며, 일반적인 답변보다 훨씬 우아합니다.
내가 쓴 이 작은 함수를 사용해봐.
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);
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;
}
2를 곱하고, -1로 반올림하고, 2로 나눕니다.
여기 Musthafa의 기능이 있습니다.이것은 더 복잡하지만 정수뿐만 아니라 플로트 번호도 지원합니다.반올림할 숫자는 문자열로도 사용할 수 있습니다.
/**
* @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의 제안까지 시도해 보았습니다.플로트 번호에 대응하고 있지 않고, 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
저는 이렇게 합니다.
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);
function round_up($n, $x = 5) {
$rem = $n % $x;
if ($rem < 3)
return $n - $rem;
else
return $n - $rem + $x;
}
이 함수는 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);
}
수정하고 잘못된 부분이 있으면 수정하세요.
아마 이 라이너도 고려해 볼 수 있을 겁니다.더 빨라!기능하는 것$num >= 0
★★★★★★★★★★★★★★★★★」$factor > 0
.
$num = 52;
$factor = 55;
$roundedNum = $num + $factor - 1 - ($num + $factor - 1) % $factor;
언급URL : https://stackoverflow.com/questions/4133859/round-up-to-nearest-multiple-of-five-in-php
'IT' 카테고리의 다른 글
Java로 "time above"를 알려주세요. (0) | 2022.12.07 |
---|---|
libcurl이 있는 HTTP 상태 코드? (0) | 2022.12.07 |
Intelij IDEA에서 메서드 파라미터 힌트를 표시하는 방법 (0) | 2022.12.07 |
javascript에서 플로트를 포맷하는 방법은? (0) | 2022.12.07 |
Mocha로 단일 테스트를 실행하는 방법은 무엇입니까? (0) | 2022.12.07 |