Problem mit Float und Double:
Beispiel 1:
Falsche Berechnung beim Subtrahieren von Dollarbeträgen:
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Beispiel 2:
Fehler beim Kauf von neun Artikeln für je 10 Cent:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Gleichmäßige Rundung, Fehler bleiben bestehen.
Problem bei progressiven Berechnungen, z. B. beim Kauf von Süßigkeiten zu Stufenpreisen von 0,10 bis 1,00.
Beispiel 3:
Fehler beim Süßigkeitenkauf, bis man kein Geld mehr hat:
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Lösung 1: BigDecimal verwenden
Beispiel mit 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
Die Berechnung ist jetzt präzise.
Nachteile von BigDecimal:
Lösung 2: Verwenden Sie int oder long
Beispiel mit int (in Cent):
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
Die Berechnung ist schnell und genau.
Abschluss:
Auswahlmöglichkeiten:
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3