To są dwa osobne pytania: „Do czego mam używać BigDecimal
?” i „Co ogólnie robię?”
Bo BigDecimal
: jest to trochę trudne, ponieważ nie robią tego samego . BigDecimal.valueOf(double)
użyje kanoniczną String
reprezentację na double
wartość przekazana do instancji BigDecimal
obiektu. Innymi słowy: wartością BigDecimal
obiektu będzie to, co zobaczysz, kiedy to zrobisz System.out.println(d)
.
Jeśli new BigDecimal(d)
jednak użyjesz , BigDecimal
spróbuje przedstawić double
wartość tak dokładnie, jak to możliwe . Będzie to zazwyczaj powodują dużo więcej cyfr są przechowywane niż chcesz. Ściśle mówiąc, jest to bardziej poprawne niż valueOf()
, ale jest o wiele mniej intuicyjne.
Jest ładne wyjaśnienie tego w JavaDoc:
Wyniki tego konstruktora mogą być nieco nieprzewidywalne. Można założyć, że pisanie new BigDecimal(0.1)
w Javie tworzy wartość BigDecimal
równą dokładnie 0,1 (nieskalowana wartość 1 ze skalą 1), ale w rzeczywistości jest równa 0,1000000000000000055511151231257827021181583404541015625. Dzieje się tak, ponieważ 0.1 nie może być reprezentowane dokładnie jako a double
(lub, jeśli o to chodzi, jako ułamek binarny o dowolnej skończonej długości). W związku z tym wartość, która jest przekazywana do konstruktora, nie jest dokładnie równa 0,1, niezależnie od wyglądu.
Ogólnie, jeśli wynik jest taki sam (tj. Nie w przypadku BigDecimal
, ale w większości innych przypadków), to valueOf()
powinno być preferowane: może wykonywać buforowanie wspólnych wartości (jak widać na Integer.valueOf()
), a nawet może zmieniać zachowanie buforowania bez osoba dzwoniąca musi zostać zmieniona. zawszenew
utworzy instancję nowej wartości, nawet jeśli nie jest to konieczne (najlepszy przykład: vs. ).new Boolean(true)
Boolean.valueOf(true)