Implementasi PHP dari algoritma largest remainder method . Metode ini adalah cara paling umum untuk menghilangkan masalah pembulatan saat bekerja dengan nilai persentase yang dibulatkan.
Asumsikan contoh berikut:
18.562874251497007%
20.958083832335326%
18.562874251497007%
19.161676646706585%
22.75449101796407%
Saat membulatkan persentase di atas menggunakan fungsi pembulatan PHP, kita mendapatkan:
19%
21%
19%
19%
23%
Yang sebenarnya jumlahnya mencapai 101%
, bukan 100%
. largest remainder method memecahkan masalah ini dengan melakukan langkah-langkah berikut:
composer require " kschu91/largest-remainder-method "
Jika Anda belum familiar dengan composer: penggunaan dasar composer
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
print_r ( $ lr -> round ());
yang mengakibatkan:
Array
(
[0] => 19
[1] => 21
[2] => 18
[3] => 19
[4] => 23
)
Presisi default diatur ke 0
. Namun Anda dapat mengubah perilaku ini dengan menggunakan metode setPrecision
:
$ numbers = [
18.562874251497007 ,
20.958083832335326 ,
18.562874251497007 ,
19.161676646706585 ,
22.75449101796407
];
$ lr = new LargestRemainder ( $ numbers );
$ lr -> setPrecision ( 2 );
print_r ( $ lr -> round ());
yang mengakibatkan:
Array
(
[0] => 18.56
[1] => 20.96
[2] => 18.56
[3] => 19.16
[4] => 22.76
)
Biasanya, Anda tidak memiliki nomor yang ingin Anda terapkan algoritma ini dalam array sederhana seperti pada contoh di atas. Anda lebih suka menyimpannya dalam objek atau array asosiatif. Itu sebabnya perpustakaan ini juga mendukung panggilan balik untuk menerapkan algoritma ini.
Anda hanya perlu menyediakan 2 panggilan balik ke metode usort
. Yang pertama, untuk mengambil nomor yang relevan dari objek. Dan yang kedua menulis kembali angka yang dibulatkan ke objek yang dihasilkan.
Pastikan untuk meneruskan argumen pertama dari panggilan balik penyetel sebagai referensi, misalnya. seperti pada contoh di bawah ini:
&$item
. Jika tidak maka data yang dihasilkan akan tetap mempertahankan angka aslinya dan tidak dibulatkan.
$ 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 ;
}
));
yang mengakibatkan:
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
)
)