การใช้ PHP ของอัลกอริธึม largest remainder method วิธีนี้เป็นวิธีที่พบได้บ่อยที่สุดในการกำจัดปัญหาการปัดเศษเมื่อทำงานกับค่าเปอร์เซ็นต์ที่ปัดเศษ
สมมติตัวอย่างต่อไปนี้:
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 "
หากคุณไม่คุ้นเคยกับผู้แต่ง: การใช้งานพื้นฐานของผู้แต่ง
$ 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
)
โดยส่วนใหญ่ คุณไม่มีตัวเลขที่ต้องการใช้อัลกอริธึมนี้ในอาร์เรย์แบบง่ายดังตัวอย่างด้านบน คุณอยากให้มันอยู่ในอ็อบเจ็กต์หรืออาเรย์แบบเชื่อมโยง นั่นเป็นสาเหตุที่ไลบรารีนี้ยังรองรับการโทรกลับสำหรับการใช้อัลกอริทึมนี้ด้วย
คุณเพียงแค่ต้องระบุการโทรกลับ 2 รายการให้กับวิธี usort
อันแรกเพื่อดึงหมายเลขที่เกี่ยวข้องจากวัตถุ และอันที่สองเพื่อเขียนเลขปัดเศษกลับไปยังวัตถุผลลัพธ์
ตรวจสอบให้แน่ใจว่าได้ส่งอาร์กิวเมนต์แรกของการโทรกลับ 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
)
)