تطبيق 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
)
في الغالب، ليس لديك الأرقام التي تريد تطبيق هذه الخوارزمية عليها في مصفوفة بسيطة كما في الأمثلة أعلاه. من الأفضل أن تكون في كائنات أو صفائف ترابطية. ولهذا السبب تدعم هذه المكتبة أيضًا عمليات الاسترجاعات لتطبيق هذه الخوارزمية.
كل ما عليك فعله هو توفير ردين اتصال للطريقة usort
. الأول، لجلب الرقم ذي الصلة من الكائن. والثاني هو كتابة الرقم المقرب مرة أخرى إلى الكائن الناتج.
تأكد من تمرير الوسيطة الأولى لرد اتصال أداة الضبط كمرجع، على سبيل المثال. كما في المثال أدناه:
&$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
)
)