"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > البند تجنب التعويم والمضاعفة إذا كانت الإجابات الدقيقة مطلوبة

البند تجنب التعويم والمضاعفة إذا كانت الإجابات الدقيقة مطلوبة

تم النشر بتاريخ 2024-11-06
تصفح:286

Item  Evite o float e o double caso sejam necessárias respostas exatas

مشكلة في التعويم والمزدوج:

  • مصممة للحسابات العلمية والرياضية، وإجراء عمليات حسابية ثنائية الفاصلة العائمة.
  • غير مناسب للحسابات النقدية أو المواقف التي تتطلب إجابات دقيقة.
  • لا يمكن تمثيل القوى السالبة للعدد عشرة بدقة، مثل 0.1، مما يؤدي إلى حدوث أخطاء.

مثال 1:
حساب غير صحيح عند طرح المبالغ بالدولار:

System.out.println(1.03 - 0.42);  // Resultado: 0.6100000000000001

مثال 2:
خطأ عند شراء تسعة عناصر مقابل 10 سنتات لكل منها:

System.out.println(1.00 - 9 * 0.10);  // Resultado: 0.09999999999999998

حتى التقريب، تستمر الأخطاء.
مشكلة في الحسابات التصاعدية، كما هو الحال عند شراء الحلويات بأسعار تزايدية من 0.10 إلى 1.00.

مثال 3:
خطأ عند شراء الحلويات حتى لا يكون لديك المزيد من المال:

double funds = 1.00;
for (double price = 0.10; funds >= price; price  = 0.10) {
    funds -= price;
}
System.out.println(funds);  // Resultado: 0.3999999999999999

الحل 1: استخدام BigDecimal

  • مثالية للحسابات المالية والمواقف التي تكون فيها الدقة ضرورية.
  • تجنب استخدام المُنشئ المزدوج لـ BigDecimal، مفضلاً مُنشئ السلسلة.

مثال مع BigDecimal:

BigDecimal funds = new BigDecimal("1.00");
BigDecimal price = new BigDecimal("0.10");
int itemsBought = 0;

while (funds.compareTo(price) >= 0) {
    funds = funds.subtract(price);
    price = price.add(new BigDecimal("0.10"));
    itemsBought  ;
}
System.out.println(itemsBought   " items bought. Money left: "   funds);  
// Resultado: 4 items bought. Money left: 0.00

أصبح الحساب دقيقًا الآن.

عيوب BigDecimal:

  • أقل ملاءمة للاستخدام من الأنواع البدائية.
  • أبطأ، خاصة بالنسبة للكميات الكبيرة من العمليات.

الحل 2: استخدم int أو long

  • لتجنب مشاكل الدقة، قم بالحساب بالسنت، باستخدام int أو long بدلاً من الدولار مع المضاعفة.

مثال مع int (بالسنت):

int funds = 100;  // 1.00 dólar = 100 centavos
int price = 10;   // 0.10 dólar = 10 centavos
int itemsBought = 0;

while (funds >= price) {
    funds -= price;
    price  = 10;
    itemsBought  ;
}
System.out.println(itemsBought   " items bought. Money left: "   funds);  
// Resultado: 4 items bought. Money left: 0

الحساب سريع ودقيق.

خاتمة:

  • لا تستخدم التعويم أو المزدوج للحسابات التي تتطلب الدقة الدقيقة.
  • استخدم BigDecimal للحسابات النقدية أو المواقف التي تتطلب دقة عشرية.
  • استخدم int أو long للحسابات المالية التي لا تتضمن أرقامًا كبيرة، وقم بإجراء العمليات الحسابية بالسنت.

الاختيارات:

  • لما يصل إلى 9 أرقام، استخدم int.
  • استخدم ما يصل إلى 18 رقمًا طويلًا.
  • للكميات الأكبر، استخدم BigDecimal.
  • يوضح هذا الملخص أنه، اعتمادًا على السياق، يمكن أن يؤدي الاختيار بين BigDecimal أو int أو long إلى تحسين الدقة والأداء.
بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/giselecoder/item-60-evite-o-float-e-o-double-caso-sejam-necessarias-respostas-exatas-3mep?1 إذا كان هناك أي انتهاك، من فضلك اتصل بـ [email protected]
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3