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 StringDarstellung des übergebenen doubleWerts, um das BigDecimalObjekt zu instanziieren . Mit anderen Worten: Der Wert des BigDecimalObjekts entspricht dem, was Sie dabei sehen System.out.println(d).
Wenn Sie new BigDecimal(d)jedoch verwenden, BigDecimalversucht der, den doubleWert 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 BigDecimalein 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. newwird immer einen neuen Wert, wenn auch nicht notwendig (: beste Beispiel instanziiert new Boolean(true)vs. Boolean.valueOf(true)).