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 doublenilai yang diteruskan untuk membuat instance BigDecimalobjek. Dengan kata lain: Nilai BigDecimalobjek akan menjadi apa yang Anda lihat saat melakukannya System.out.println(d).
Jika Anda menggunakan new BigDecimal(d)bagaimanapun, maka BigDecimalakan mencoba untuk mewakili doublenilai 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 BigDecimalyang 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. newakan selalu memberi contoh nilai baru, meskipun tidak perlu (contoh terbaik: new Boolean(true)vs. Boolean.valueOf(true)).