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
)
)