[JAVA] BigDecimal.valueOf (Doppel-) Geschichte

Bruch in großer Dezimalzahl

Big Decimal ist der De-facto-Standard für Dezimalberechnungen in Java. Wenn Sie versuchen, mit Double Type oder Float Type zu rechnen, tritt im Handumdrehen ein Fehler auf, der schrecklich ist.

Darüber hinaus wird diese große Dezimalzahl aufgrund ihrer schlechten Natur wahrscheinlich am meisten von Neulingen verwendet. Wenn Sie den folgenden Code schreiben, wird ein Fehler angezeigt. Da beim Deklarieren als Doppeltyp ein Fehler auftritt, Dies liegt daran, dass der Fehler auch dann erhalten bleibt, wenn Sie darauf basierend eine große Dezimalzahl erstellen. Als ich ein Neuling war, haben mich meine Senioren dazu gebracht, wie folgt zu schreiben.


BigDecimal bad = new BigDecimal(1.3);
//Intern 1.3000000000000000444089209850062616169452667236328125

BigDecimal good = new BigDecimal("1.3");

BigDecimal.valueOf(double) Wenn es sich also um Brüche in BigDecimal handelt, ist das Argument eine Zeichenfolge und durchdringt den Körper vollständig. Als ich kürzlich ein wenig gesucht habe, gab es einige Kommentarseiten, auf denen stand, dass BigDecimal.valueOf (double) problemlos mit Doppeltypen umgehen kann.

Wenn man jedoch bedenkt, dass "new BigDecimal (double)" zum Zeitpunkt des doppelten Typs keinen exakten Dezimalbruch enthalten kann, tritt ein Fehler auf. BigDecimal.valueOf (double) sollte ebenfalls ungenau sein.

Aber überraschenderweise funktioniert in den meisten Fällen "BigDecimal.valueOf (double)" richtig.

BigDecimal fromValueOf = BigDecimal.valueOf(1.3);
//Dies ist eine neue Big Decimal("1.3")Wird der gleiche Wert sein wie

Was bedeutet das.

Implementierung von BigDecimal.valueOf

Bei der Implementierung von "BigDecimal.valueOf (double)" war dies wie folgt. (Zitiert aus OpenJdk)

    public static BigDecimal valueOf(double val) {
        //Der Kommentarteil wird weggelassen
        return new BigDecimal(Double.toString(val));
    }

Die Implementierung ist überraschend einfach und BigDecimal wird aus der Zeichenfolge unter Verwendung des Werts generiert, der durch Konvertieren des Doppeltyps in eine Zeichenfolge mit "Double.toString (double)" erhalten wird. Solange Double.toString (double) den Wert des Literal (oder der entsprechenden numerischen Darstellung), auf dem der Double-Wert basiert, ordnungsgemäß zurückgibt, wird BigDecimal wahrscheinlich wie beabsichtigt zurückgegeben.

Stellt Double.toString () den Wert ordnungsgemäß wieder her?

In den meisten Fällen ist es in Ordnung, aber es scheint nicht perfekt für Zahlen mit einer sehr großen Anzahl von Ziffern nach dem Dezimalpunkt zurückzukehren.

BigDecimal.valueOf(1.0000000003000003)
//1.0000000003000002

Wenn Sie jedoch nicht darauf zielen, wird es sich im Grunde nicht verschieben. Es ist unwahrscheinlich, dass Sie eine so kleine Anzahl von Ziffern verwenden.

Zusammenfassung

Beiseite

Dies ist übrigens der Fall, wenn das im Literal deklarierte Doppel so verwendet wird, wie es ist. Wenn Sie den Wert nach der Berechnung mit doppeltem Typ verwenden, funktioniert er nicht.

BigDecimal.valueOf(1.3 + 1.5 + 1.4)
///4.199999999999999

Nach der Berechnung Big Decimal.

Recommended Posts

BigDecimal.valueOf (Doppel-) Geschichte
JUnit Geschichte
Meine Batis-Geschichte