إن حساب النقطة العائمة، وهو موضوع معقد غالبا ما يساء فهمه، ينتشر في أنظمة الكمبيوتر الحديثة. نظرًا لأن معظم الأعداد الكسرية تفتقر إلى تمثيل ثنائي دقيق، فإن التقريب يحدث حتمًا. يعد فهم الفروق الدقيقة في عمليات الفاصلة العائمة أمرًا بالغ الأهمية، كما هو موضح في "ما يجب أن يعرفه كل عالم كمبيوتر عن حساب الفاصلة العائمة."
الإجابة: لا، لا يمكنك الاعتماد على إعدادات الدقة في php.ini للحصول على دقة متسقة مكونة من رقمين، حتى بالنسبة للأرقام الأقل من 10^6، لأن طول الدقة يمكن أن يزيد أثناء العمليات الحسابية.
الإجابة: خذ بعين الاعتبار المثال التالي مع تطبيق خصم 10% على الكيلوجرام الأول فقط:
ini_set('precision', 8); // Your precision $a = 5.88; // Cost of 1kg $q = 2.49; // User buys 2.49 kg $b = $a * 0.01; // 10% Discount only on the first kg echo ($a * $q) - $b;
الإخراج: 14.5824
الإجابة: إعدادات الدقة PHP ليست أساسًا موثوقًا للحسابات المالية أو دقة الفاصلة العائمة. من الأفضل استخدام مكتبات أو طرق متخصصة.
لنفحص أمثلة مختلفة لتوضيح قيود الدقة:
$a = 342349.23; $b = 341765.07; // Example A: precision = 20 echo $a - $b, PHP_EOL; // 584.15999999997438863 echo floatval(round($a - $b, 2)), PHP_EOL; // 584.15999999999996817 (rounding introduces instability) echo number_format($a - $b, 2), PHP_EOL; // 584.16 echo bcsub($a, $b, 2), PHP_EOL; // 584.15 // Example B: precision = 14 echo $a - $b, PHP_EOL; // 584.15999999997 echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16 echo number_format($a - $b, 2), PHP_EOL; // 584.16 echo bcsub($a, $b, 2), PHP_EOL; // 584.16 // Example C: precision = 6 echo $a - $b, PHP_EOL; // 584.16 echo floatval(round($a - $b, 2)), PHP_EOL; // 584.16 echo number_format($a - $b, 2), PHP_EOL; // 584.16 echo bcsub($a, $b, 2), PHP_EOL; // 584.00 // Example D: precision = 3 echo $a - $b, PHP_EOL; // 584 echo floatval(round($a - $b, 2)), PHP_EOL; // 584 echo number_format($a - $b, 2), PHP_EOL; // 584.16 (consistent) echo bcsub($a, $b, 2), PHP_EOL; // 0.00
توضح هذه الأمثلة التناقضات في الاعتماد على إعدادات الدقة PHP لإجراء حسابات دقيقة.
للحصول على حسابات مالية موثوقة، لا تنسَ حول الفاصلة العائمة واستخدام السنت أو فكر في وظيفة number_format للحصول على دقة متسقة مكونة من رقمين.
ini_set('precision', 8); $a = 0.19; $b = 0.16; $c = 0.01; $d = 0.01; $e = 0.01; $f = 0.01; $g = 0.01;
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3