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 jeweils 10 Cent:
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Auch beim Runden bleiben Fehler bestehen.
Problem bei progressiven Berechnungen, beispielsweise 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.
Fazit:
Auswahlmöglichkeiten:
Das obige ist der detaillierte Inhalt vonItem Vermeiden Sie Float und Double, wenn genaue Antworten erforderlich sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!