largest remainder method
v1.1
largest remainder method 알고리즘의 PHP 구현입니다. 이 방법은 반올림된 백분율 값으로 작업할 때 반올림 문제를 제거하는 가장 일반적인 방법입니다.
다음 예를 가정해 보겠습니다.
18.562874251497007%
20.958083832335326%
18.562874251497007%
19.161676646706585%
22.75449101796407%
PHP의 반올림 함수를 사용하여 위의 백분율을 반올림하면 다음과 같은 결과를 얻습니다.
19%
21%
19%
19%
23%
실제로 합산하면 100%
가 아닌 101%
가 됩니다. largest remainder method 다음 단계를 수행하여 이 문제를 해결합니다.
composer require " kschu91/largest-remainder-method "
작곡가에 익숙하지 않은 경우: 작곡가 기본 사용법
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
print_r ( $ lr -> round ());
결과는 다음과 같습니다.
Array
(
[0] => 19
[1] => 21
[2] => 18
[3] => 19
[4] => 23
)
기본 정밀도는 0
으로 설정됩니다. 하지만 setPrecision
메소드를 사용하면 이 동작을 변경할 수 있습니다.
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
$ lr -> setPrecision ( 2 );
print_r ( $ lr -> round ());
결과는 다음과 같습니다.
Array
(
[0] => 18.56
[1] => 20.96
[2] => 18.56
[3] => 19.16
[4] => 22.76
)
대부분 위의 예에서와 같이 간단한 배열에 이 알고리즘을 적용하려는 숫자가 없습니다. 오히려 객체나 연관 배열에 두는 것이 좋습니다. 이것이 바로 이 라이브러리가 이 알고리즘을 적용하기 위한 콜백을 지원하는 이유입니다.
usort
메소드에 2개의 콜백을 제공하기만 하면 됩니다. 첫 번째는 객체에서 관련 번호를 가져오는 것입니다. 그리고 두 번째는 반올림된 숫자를 결과 객체에 다시 쓰는 것입니다.
setter 콜백의 첫 번째 인수를 참조로 전달해야 합니다. 아래 예와 같이:
&$item
. 그렇지 않은 경우 결과 데이터는 원래 숫자를 유지하고 반올림되지 않습니다.
$ objects = [
[ ' a ' => 18.562874251497007 ],
[ ' a ' => 20.958083832335326 ],
[ ' a ' => 18.562874251497007 ],
[ ' a ' => 19.161676646706585 ],
[ ' a ' => 22.75449101796407 ]
];
$ lr = new LargestRemainder ( $ objects );
$ lr -> setPrecision ( 2 );
print_r ( $ lr -> uround (
function ( $ item ) {
return $ item [ ' a ' ];
},
function (& $ item , $ value ) {
$ item [ ' a ' ] = $ value ;
}
));
결과는 다음과 같습니다.
Array
(
[0] => Array
(
[a] => 18.55
)
[1] => Array
(
[a] => 20.94
)
[2] => Array
(
[a] => 18.55
)
[3] => Array
(
[a] => 19.15
)
[4] => Array
(
[a] => 22.74
)
)