2017-09-25 3 views
2

Ich hatte erwartet, diesen Code:BigDecimal Rounding falsch

double valore = 20.775; 

    BigDecimal c = new BigDecimal(valore); 
    c = c.setScale(2, RoundingMode.HALF_UP); 


    System.out.println(c.doubleValue()); 

20,78 zurückzukehren, aber es ist 20.77 stattdessen zurück.

Ist es ein Fehler? Oder fehlt mir etwas?

+0

Mögliche Duplikat [Unvorhersehbarkeit des BigDecimal (double) Konstruktor] (https://stackoverflow.com/questions/12218515/unpredictability-of-the-bigdecimaldouble-constructor) – Goibniu

+0

BigDecimal rundet korrekt. Sie verwenden doubleValue(), was die Inkorrektheit verursacht. –

Antwort

5

Alles ist korrekt.
Sie können einige High-Level-Details in another answer on SO lesen oder mehr in documentation to BigDecimal

lesen ist es nicht üblich BigDecimal Konstruktor mit double param zu verwenden, weil es genau das darstellen, was in double ist. So , wenn Sie schreiben: new BigDecimal(20.775) Sie müssen nicht unbedingt 20,775 als Folge haben (eher werden Sie so etwas wie 20.77499999999999857891452847979962825775146484375 haben)

Für Sie Test:
1) Prüfung BigDecimal Darstellung
a) System.out.println(new BigDecimal(20.775)); =>20.77499999999999857891452847979962825775146484375
b) System.out.println(new BigDecimal("20.775")); =>20.775

2) Test mit verschiedenen BigDecimal Konstruktoren Abrunden:
a) new BigDecimal(20.775) nach dem Runden der Hälfte wird 20,77 angezeigt.
b) new BigDecimal("20.775") nach dem Runden die Hälfte zeigt 20,78.
c) new BigDecimal(String.valueOf(20.775) nach dem Runden der Hälfte wird 20,78 angezeigt.

So als Fazit: Verwenden Sie nicht BigDecimal Konstruktor mit double param. Verwenden Sie stattdessen BigDecimal Konstruktor mit String param.

Hoffe, es hilft