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%
事實上加起來是101%
而不是100%
。 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 個回呼。第一個,從物件中取得相關數字。第二個將四捨五入的數字寫回結果物件。
確保傳遞 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
)
)