مشكلة في التعويم والمزدوج:
مثال 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 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 (بالسنت):
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
الحساب سريع ودقيق.
خاتمة:
الاختيارات:
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3