„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Item Vermeiden Sie Float und Double, wenn genaue Antworten erforderlich sind

Item Vermeiden Sie Float und Double, wenn genaue Antworten erforderlich sind

Veröffentlicht am 06.11.2024
Durchsuche:540

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

Problem mit Float und Double:

  • Entwickelt für wissenschaftliche und mathematische Berechnungen, führt binäre Gleitkomma-Arithmetik durch.
  • Nicht geeignet für Geldberechnungen oder Situationen, die genaue Antworten erfordern.
  • Negative Zehnerpotenzen wie 0,1 können nicht genau dargestellt werden, was zu Fehlern führt.

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

  • Ideal für Finanzberechnungen und Situationen, in denen es auf Präzision ankommt.
  • Vermeiden Sie die Verwendung des Doppelkonstruktors von BigDecimal und bevorzugen Sie den String-Konstruktor.

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:

  • Weniger praktisch zu verwenden als primitive Typen.
  • Langsamer, insbesondere bei großen Operationsvolumina.

Lösung 2: Verwenden Sie int oder long

  • Um Genauigkeitsprobleme zu vermeiden, rechnen Sie in Cent und verwenden Sie int oder long anstelle von Dollar mit double.

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:

  • Verwenden Sie Float oder Double nicht für Berechnungen, die genaue Genauigkeit erfordern.
  • Verwenden Sie BigDecimal für Geldberechnungen oder Situationen, die eine Dezimalgenauigkeit erfordern.
  • Verwenden Sie int oder long für Finanzberechnungen, die keine großen Zahlen beinhalten, und führen Sie die Berechnungen in Cent durch.

Auswahlmöglichkeiten:

  • Für bis zu 9 Ziffern verwenden Sie int.
  • Für bis zu 18 Ziffern verwenden Sie long.
  • Für größere Mengen verwenden Sie BigDecimal.
  • Diese Zusammenfassung zeigt, dass je nach Kontext die Wahl zwischen BigDecimal, int oder long sowohl Präzision als auch Leistung optimieren kann.
Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/giselecoder/item-60-evite-o-float-e-o-double-caso-sejam-necessarias-respostas-exatas-3mep?1 Wenn es einen Verstoß gibt, bitte Kontaktieren Sie Study_golang@163 .comdelete
Neuestes Tutorial Mehr>

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