Saya menemukan dua cara untuk mengeluarkan objek BigDecimal dari d ganda.
1. new BigDecimal(d)
2. BigDecimal.valueOf(d)
Pendekatan mana yang lebih baik? Akankah valueOf membuat objek baru?
Secara umum (bukan hanya BigDecimal), apa yang direkomendasikan - new atau valueOf?
Terima kasih.
java
bigdecimal
Manish Mulani
sumber
sumber
Jawaban:
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
daridouble
nilai yang diteruskan untuk membuat instanceBigDecimal
objek. Dengan kata lain: NilaiBigDecimal
objek akan menjadi apa yang Anda lihat saat melakukannyaSystem.out.println(d)
.Jika Anda menggunakan
new BigDecimal(d)
bagaimanapun, makaBigDecimal
akan mencoba untuk mewakilidouble
nilai seakurat mungkin . Ini biasanya akan menghasilkan lebih banyak digit yang disimpan daripada yang Anda inginkan. Sebenarnya, ini lebih benar daripadavalueOf()
, tapi itu kurang intuitif.Ada penjelasan bagus tentang ini di JavaDoc:
Secara umum, jika hasilnya sama (yaitu tidak dalam kasus
BigDecimal
, tetapi dalam kebanyakan kasus lain), makavalueOf()
sebaiknya lebih disukai: ia dapat melakukan caching nilai-nilai umum (seperti yang terlihat diInteger.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)
).sumber
new BigDecimal()
lebih baik dariBigDecimal.valueOf()
?new BigDecimal()
akan disukai dan contoh kapanBigDecimal.valueOf()
akan disukai?new BigDecimal(1.0/30.0);
danBigDecimal.valueOf(1.0/30.0)
. Lihat hasil mana yang sebenarnya lebih mendekati pecahan numerik 1/30.Jika Anda menggunakan
BigDecimal
objek untuk menyimpan nilai mata uang, saya sangat menyarankan agar Anda TIDAK melibatkan nilai ganda di mana pun dalam perhitungannya.Seperti yang dinyatakan dalam jawaban lain, ada masalah akurasi yang diketahui dengan nilai ganda dan ini akan kembali menghantui Anda.
Setelah Anda melewatinya, jawaban atas pertanyaan Anda sederhana. Selalu gunakan metode konstruktor dengan nilai String sebagai argumen untuk konstruktor, karena tidak ada
valueOf
metode untukString
.Jika Anda ingin bukti, coba yang berikut ini:
Anda akan mendapatkan hasil sebagai berikut:
Lihat juga pertanyaan terkait ini
sumber
Pada dasarnya valueOf (double val) hanya melakukan ini:
return new BigDecimal(Double.toString(val));
Oleh karena itu -> ya, objek baru akan dibuat :).
Secara umum saya pikir itu tergantung pada gaya pengkodean Anda. Saya tidak akan mencampurkan valueOf dan "new", jika keduanya merupakan hasil yang sama.
sumber
valueOf()
memiliki perilaku yang lebih intuitif , sedangkannew BigDecimal(d)
memiliki perilaku yang lebih benar . Cobalah keduanya dan lihat perbedaannya.new BigDecimal(1) != new BigDecimal(1)
tetapiBigDecimal.valueOf(1) == BigDecimal.valueOf(1)
BigDecimal
adalah kekal itu harus diperlakukan dengan cara yang sama bahwa pembungkus primitif (Integer
,Byte
, ...) danString
diperlakukan: identitas objek seharusnya tidak peduli untuk kode Anda, hanya nilai harus peduli.valueOf()
harus umumnya lebih disukai. Tetapi perhatikan ituBigDecimal.valueOf(double)
tidak melakukan caching apa pun (dan mungkin juga tidak sepadan).