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ą Stringreprezentację na doublewartość przekazana do instancji BigDecimalobiektu. Innymi słowy: wartością BigDecimalobiektu będzie to, co zobaczysz, kiedy to zrobisz System.out.println(d).
Jeśli new BigDecimal(d)jednak użyjesz , BigDecimalspróbuje przedstawić doublewartość 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ść BigDecimalró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)