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 "
Composer に慣れていない場合: Composer の基本的な使い方
$ 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 つのコールバックを指定するだけです。 1 つ目は、オブジェクトから関連する番号を取得することです。 2 つ目は、丸められた数値を結果のオブジェクトに書き戻すものです。
セッター コールバックの最初の引数を必ず参照として渡してください。以下の例のように:
&$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
)
)