Itu adalah dua pertanyaan terpisah: "Apa yang harus saya gunakan BigDecimal
?" dan "Apa yang harus saya lakukan secara umum?"
Sebab BigDecimal
: ini agak rumit, karena mereka tidak melakukan hal yang sama . BigDecimal.valueOf(double)
akan menggunakan representasi kanonikString
dari double
nilai yang diteruskan untuk membuat instance BigDecimal
objek. Dengan kata lain: Nilai BigDecimal
objek akan menjadi apa yang Anda lihat saat melakukannya System.out.println(d)
.
Jika Anda menggunakan new BigDecimal(d)
bagaimanapun, maka BigDecimal
akan mencoba untuk mewakili double
nilai seakurat mungkin . Ini biasanya akan menghasilkan lebih banyak digit yang disimpan daripada yang Anda inginkan. Sebenarnya, ini lebih benar daripada valueOf()
, tapi itu kurang intuitif.
Ada penjelasan bagus tentang ini di JavaDoc:
Hasil konstruktor ini bisa jadi agak tidak terduga. Orang mungkin berasumsi bahwa menulis new BigDecimal(0.1)
di Java membuat nilai BigDecimal
yang sama persis dengan 0,1 (nilai tidak berskala 1, dengan skala 1), tetapi sebenarnya sama dengan 0,1000000000000000055511151231257827021181583404541015625. Ini karena 0,1 tidak dapat direpresentasikan persis sebagai a double
(atau, dalam hal ini, sebagai pecahan biner dengan panjang berhingga). Dengan demikian, nilai yang diteruskan ke konstruktor tidak persis sama dengan 0,1, meskipun penampilan.
Secara umum, jika hasilnya sama (yaitu tidak dalam kasus BigDecimal
, tetapi dalam kebanyakan kasus lain), maka valueOf()
sebaiknya lebih disukai: ia dapat melakukan caching nilai-nilai umum (seperti yang terlihat di Integer.valueOf()
) dan bahkan dapat mengubah perilaku cache tanpa pemanggil harus diganti. new
akan selalu memberi contoh nilai baru, meskipun tidak perlu (contoh terbaik: new Boolean(true)
vs. Boolean.valueOf(true)
).