لماذا يحسب PHP -2.27373675443E-13 لـ (89.99 * 12) - 1079.88؟

ممكن تكرار:
   PHP حساب التعويم
   دقة حساب PHP تعويم

لماذا يحسب PHP -2.27373675443E-13 لهذا ...

echo  (89.99*12) - 1079.88;

ألا يجب أن تعود 0؟

2

1 إجابة

floating point calculations are complicated and potentially inaccurate. this problem appears in every programming-language because decimal numbers can't be stored perfectly in binary representation.

للإشارة إلى مستندات PHP حول هذا :

وتحذير
   دقة النقطة العائمة

     

أرقام النقطة العائمة محدودة الدقة. على الرغم من أنه يعتمد على   النظام ، يستخدم PHP نموذج الدقة المزدوجة IEEE 754 ،   مما يعطي خطأً نسبياً قصوى بسبب التقريب في الترتيب   من 1.11e -16. العمليات الحسابية غير الأولية قد تعطي أكبر   أخطاء ، وبطبيعة الحال ، يجب النظر في انتشار الخطأ عندما   تتم مضاعفة عدة عمليات.

     

بالإضافة إلى ذلك ، الأرقام المنطقية التي يتم تمثيلها تمامًا مثل   لا تحتوي أرقام النقطة العائمة في الأساس 10 ، مثل 0.1 أو 0.7 ، على   التمثيل الدقيق كأرقام النقطة العائمة في الأساس 2 ، وهو   تستخدم داخليا ، بغض النظر عن حجم الجزء العشري. ومن ثم ، هم   لا يمكن تحويلها إلى نظرائهم الثنائي الداخلي دون   خسارة صغيرة من الدقة. هذا يمكن أن يؤدي إلى نتائج مربكة: ل   سبيل المثال ، الكلمة ((0.1 + 0.7) * 10) ستعود عادة 7 بدلا من   المتوقع 8 ، لأن التمثيل الداخلي سيكون شيء من هذا القبيل   +7.9999999999999991118 ....

     

لذا لا تثق أبدًا في النتائج العائمة للأرقام الأخيرة ، ولا تفعل ذلك   مقارنة أرقام النقطة العائمة مباشرة للمساواة. إذا كان أعلى   الدقة ضرورية ، وظائف الرياضيات الدقة التعسفية و gmp   الوظائف متاحة.

4
وأضاف
شكر. هذا أشار لي في الاتجاه الصحيح. لقد حلت المشكلة مع: صدى الجولة (89.99 * 12،2) - 1079.88 ؛
وأضاف المؤلف Castles, مصدر