Das sind zwei getrennte Fragen: "Wofür soll ich verwenden BigDecimal
?" und "Was mache ich im Allgemeinen?"
Denn BigDecimal
: das ist etwas knifflig, weil sie nicht dasselbe machen . BigDecimal.valueOf(double)
verwendet die kanonische String
Darstellung des übergebenen double
Werts, um das BigDecimal
Objekt zu instanziieren . Mit anderen Worten: Der Wert des BigDecimal
Objekts entspricht dem, was Sie dabei sehen System.out.println(d)
.
Wenn Sie new BigDecimal(d)
jedoch verwenden, BigDecimal
versucht der, den double
Wert so genau wie möglich darzustellen . Dies führt normalerweise dazu, dass viel mehr Ziffern gespeichert werden, als Sie möchten. Genau genommen ist es korrekter als valueOf()
, aber es ist viel weniger intuitiv.
Im JavaDoc gibt es eine schöne Erklärung dafür:
Die Ergebnisse dieses Konstruktors können etwas unvorhersehbar sein. Man könnte annehmen, dass beim Schreiben new BigDecimal(0.1)
in Java BigDecimal
ein Wert erstellt wird, der genau gleich 0,1 ist (ein nicht skalierter Wert von 1 mit einer Skala von 1), aber tatsächlich gleich 0,1000000000000000055511151231257827021181583404541015625. Dies liegt daran, dass 0,1 nicht genau als double
(oder im Übrigen als binärer Bruchteil einer endlichen Länge) dargestellt werden kann. Somit ist der Wert, der an den Konstruktor übergeben wird, ungeachtet des Aussehens nicht genau gleich 0,1.
In der Regel , wenn das Ergebnis das gleiche ist (also nicht im Fall BigDecimal
, aber in den meisten anderen Fällen), dann valueOf()
sollte bevorzugt werden: es Caching von gemeinsamen Werten tun (wie gesehen auf Integer.valueOf()
) und es kann sogar das Caching - Verhalten ändern , ohne Der Anrufer muss geändert werden. new
wird immer einen neuen Wert, wenn auch nicht notwendig (: beste Beispiel instanziiert new Boolean(true)
vs. Boolean.valueOf(true)
).