1. Pengantar BigDecimal
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-scale ).
2. Pengenalan BigDecimal
Saat menggunakan bahasa pemrograman Java seperti perbankan dan keuangan yang memerlukan perhitungan nilai numerik presisi tinggi, kami sering menggunakan BigDecimal dan BigInteger alih-alih tipe int , long , float , dan double , terutama ketika berhadapan dengan data titik mengambang.
Pertama -tama mari kita lihat demonstrasi kode menggunakan tipe data dasar double untuk perhitungan dan hasil pencetakan:
kelas publik MainClass {public static void main (string [] args) {System.out.println (0,02+0,01); System.out.println (0,05+0,01); }}Hasilnya adalah sebagai berikut:
0.030.0600000000000000000000005
Pertanyaannya adalah, mengapa data dengan hasil kedua muncul? Alasan mendasarnya adalah bahwa komputer kita biner, dan biner tidak dapat secara akurat mewakili nomor titik mengambang. Ada kesalahan tertentu ketika CPU menggunakan metode "mandrel dan eksponen" (metode notasi ilmiah) untuk mengekspresikan angka titik mengambang. Oleh karena itu, ketika persyaratan akurasi data relatif tinggi, kelas besar masih perlu digunakan, meskipun kecepatan perhitungan sedikit lebih lambat.
3. Penggunaan Ulang Besar
Ada dua cara untuk membuat objek BigDecimal: Metode Konstruktor dan Statis Publik ( BigDecimal.valueOf ). Dua poin perlu diperhatikan:
1. Konstruktor mencakup dua bentuk yang menggunakan tipe dan string data dasar sebagai parameter. Yang terakhir direkomendasikan, seperti: new BigDecimal(Double.valueOf(0.09)) . Anda bisa mencobanya. Hasil output dari System.out.println(new BigDecimal(0.06).toString()); Pernyataannya adalah: 0,059999999999999999977779553950749686919152736663818359375
2. Saat desimal mencetak log atau dikonversi ke tipe data dasar, cobalah untuk menggunakan metode publik xxxValue() yang disediakan olehnya, seperti doubleValue() , bukan toString()
4. Mode pembulatan BigDecimal
Meskipun database menyimpan angka floating point presisi tinggi, biasanya perlu untuk membatasi jumlah angka desimal saat ditampilkan dalam aplikasi, seperti dua hingga tiga desimal. Pada saat ini, Anda perlu menggunakan fungsi SetScale ( int newScale, int roundingMode ). Sebagai variabel statis publik BigDecimal, ada banyak aturan operasi untuk mode pembulatan (mode pembulatan) dan ada delapan jenis publik. Berikut adalah penjelasan, dan dokumen resmi juga memperkenalkannya.
1. Round_up
Putaran dari nol. Abaikan bagian yang tidak nol dan tambahkan satu angka yang berdekatan dengan bagian yang tidak nol.
2. Round_down
Bulat ke arah mendekati nol. Tinggalkan bagian yang tidak nol, dan pada saat yang sama, satu bilangan bagian yang berdekatan tidak akan dibuang dengan menambahkan satu ke bagian yang tidak nol, dan mencegat perilaku.
3. Round_Ceiling
Bulat ke arah tak terbatas. Jika itu adalah angka positif, hasil pembulatannya sama dengan round_up; Jika ini adalah angka negatif, hasil pembulatannya sama dengan Round_down. Catatan: Mode ini tidak mengurangi ukuran nilai.
4. Round_floor
Bulat ke arah tak terbatas negatif. Jika ini adalah angka positif, hasil pembulatannya sama dengan round_down; Jika ini adalah angka negatif, hasil pembulatannya sama dengan round_up. Catatan: Mode ini tidak meningkatkan ukuran nilai.
5. round_half_up
Pembulatan ke angka "terdekat" adalah mode pembulatan pembulatan ke atas jika jarak ke dua angka yang berdekatan sama. Jika bagian dibuang> = 0,5, perilaku pembulatan sama dengan round_up; Kalau tidak, perilaku pembulatan sama dengan round_down. Pola ini adalah apa yang sering kita sebut "pembulatan" kita.
6. round_half_down
Membulatkan ke angka "terdekat", jika jarak ke dua angka yang berdekatan sama, adalah mode pembulatan pembulatan ke bawah. Jika bagian yang dibuang> 0,5, perilaku pembulatan sama dengan round_up; Kalau tidak, perilaku pembulatan sama dengan round_down. Model ini adalah apa yang sering kita sebut "putaran" kita.
7. round_half_even
Bulat ke angka "terdekat", jika jarak ke dua angka yang berdekatan sama, angka genap yang berdekatan dibulatkan. Jika angka ganjil di sebelah kiri bagian dibuang, perilaku pembulatan sama dengan round_half_up; Jika itu adalah angka genap, perilaku pembulatan sama dengan round_half_down. Catatan: Mode pembulatan ini meminimalkan kesalahan akumulasi saat serangkaian perhitungan yang diulang. Mode pembulatan ini juga disebut "metode pembulatan bankir" dan terutama digunakan di Amerika Serikat. Babak enam menjadi enam, dan lima menjadi dua situasi. Jika yang sebelumnya adalah angka ganjil, ia akan memasuki posisi, jika tidak, ia akan ditinggalkan.
8. Round_unnecessary
Pengoperasian permintaan pernyataan memiliki hasil yang akurat, sehingga pembulatan tidak diperlukan. Jika mode pembulatan ini ditentukan untuk operasi yang memperoleh hasil yang tepat, ArithMeticException dilemparkan.
Di bawah ini, mari kita berikan contoh untuk menggambarkan hasil perhitungan numerik dalam mode pembulatan yang berbeda, menjaga satu desimal:
5. Ringkasan
Di atas adalah seluruh pengenalan BigDecimal dan delapan mode pembulatan Java. Saya berharap konten artikel ini akan membantu semua orang dalam mempelajari Java.