Pengantar BigDecimal
Penjelasan dalam dokumen JDK (Cina) adalah sebagai berikut:
Jumlah desimal yang tidak berubah dan ditandatangani dari presisi sewenang -wenang. BigDecimal terdiri dari nilai non-skala integer dari setiap presisi dan skala integer 32-bit. Jika nol atau positif, skalanya adalah jumlah digit setelah titik desimal. Jika itu adalah angka negatif, kalikan nilai non-skaling dari angka dengan kekuatan skala negatif 10. Oleh karena itu, nilai yang diwakili oleh BigDecimal adalah (unscaledValue × 10-skala).
Penjelasan spesifik
1. "Nilai objek BigDecimal tidak dapat diubah". Ini menunjukkan fitur ini dalam fungsi operasi objek BigDecimal:
Salinan kode adalah sebagai berikut: BigDecimal A = BigDecimal baru ("1.22");
System.out.println ("Buat dengan nilai string:" + a);
BigDecimal B = BigDecimal baru ("2.22");
A.Add (b);
System.out.println ("A plus B adalah:" + a);
Sangat mudah untuk berpikir bahwa itu akan menghasilkan:
Bangun dengan nilai string: 1.22
A plus B adalah: 3.44
Tetapi sebenarnya A plus B adalah: 1.22
2. "BigDecimal terdiri dari nilai non-skala integer dari setiap presisi dan skala integer 32-bit. Jika nilai skala nol atau positif, skala adalah jumlah digit setelah titik desimal." Kalimat ini dapat dibaca seperti ini:
Misalnya: -12 dan 13.412
Dinyatakan sebagai: -12 × 10-0 dan 13412 × 10-3
Di sini (nilai dan skala non-skaling) direpresentasikan sebagai: [-12, 0] dan [13412, 3] masing-masing
3. "Jika nilai skala adalah angka negatif, kalikan nilai non-skala angka dengan kekuatan skala negatif 10". Kalimat ini dapat dibaca seperti ini:
Misalnya: 120.00
Nilai ini dinyatakan sebagai: 12000 × 10-2
Di sini (nilai dan skala non-skala) dinyatakan sebagai: [12000, 2]
Nilai skala di sini masih positif 2, tetapi lakukan operasi berikut:
Jumlah besar = BigDecimal baru ("-120,00");
// Mengembalikan numerik BigDecimal sama dengan desimal ini, tetapi menghilangkan semua nol ekor dari representasi ini.
jumlah = jumlah.striptrailingzeros ();
Nilai ini dinyatakan sebagai: 12 × 10-(-1)
Di sini (nilai dan skala non -skala) dinyatakan sebagai: [12, -1]
Catatan tentang penggunaan
1. Konstruktor
Salinan kode adalah sebagai berikut: BigDecimal Adouble = BigDecimal baru (1.22);
System.out.println ("Konstruksi dengan nilai ganda:" + adouble);
Astring bigdecimal = BigDecimal baru ("1.22");
System.out.println ("Buat dengan nilai string:" + astring);
Hasil output adalah sebagai berikut:
Bangun dengan doublevalue: 1.21999999999999999999733546474089962430298328399658203125
Bangun dengan nilai string: 1.22
Deskripsi JDK:
a) Hasil metode konstruksi dengan tipe parameter ganda tidak dapat diprediksi. Beberapa orang mungkin berpikir bahwa BigDecimal yang diciptakan dengan menulis newbigdecimal (0,1) di Java persis sama dengan 0,1 (nilai non-skaling 1, yang skalnya 1), tetapi sebenarnya sama dengan 0,1000000000000000000000000555115123125782702111581583404045554.256255782702121181583405551254.254.2541254827827827000000000000000.000 Ini karena 0,1 tidak dapat diekspresikan secara akurat sebagai ganda (atau untuk kasus ini tidak dapat dinyatakan sebagai desimal biner panjang terbatas). Dengan cara ini, nilai yang diteruskan ke dalam metode konstruksi tidak akan persis sama dengan 0,1 (meskipun permukaannya sama dengan nilai itu).
b) Di sisi lain, konstruktor string sepenuhnya dapat diprediksi: Menulis ke newBigDecimal ("0.1") akan menciptakan BigDecimal, yang persis 0.1 yang diharapkan. Oleh karena itu, sebagai perbandingan, umumnya disarankan untuk menggunakan konstruktor string terlebih dahulu.
c) Ketika ganda harus digunakan sebagai sumber untuk BigDecimal, perhatikan bahwa konstruktor ini memberikan konversi yang akurat; Itu tidak memberikan hasil yang sama seperti: pertama -tama gunakan metode double.tostring (ganda), kemudian gunakan konstruktor BigDecimal (String). Untuk mengonversi double ke string, Anda juga dapat menggunakan metode statis String: String.ValueOf (double).
2. Operasi. Tambahan, pengurangan, perkalian dan divisi sebenarnya mengembalikan objek BigDecimal baru, karena BigDecimal tidak dapat diubah, dan objek baru akan dihasilkan saat melakukan setiap langkah operasi, jadi A.Add (b); Meskipun operasi penambahan dilakukan, A tidak menyimpan nilai setelah operasi penambahan. Penggunaan yang benar harus a = a.add (b);
contoh:
Tentukan apakah objek BigDecimal adalah integer:
Salin kode sebagai berikut: private boolean isIntegerValue (BigDecimal BD) {
return bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). skala () <= 0;
}
Mengapa melakukan ini? Harap uji contoh berikut:
Salin kode sebagai berikut: jumlah BigDecimal = BigDecimal baru ("-120.00"); // Harap coba "0", "0.00", "1.00", "10.00" dan "10.10" masing-masing
System.out.println (jumlah.signum ()); // positif dan negatif
System.out.println (next.scale ()); //Skala
System.out.println (jumlah.striptrailingzeros (). Skala ()); // skala setelah zeroing
Referensi: Kelas BigDecimal