Menyelam ke Kedalaman ArithmeticException: Bahagian Tidak Penamat
Coretan kod menyediakan percubaan untuk membahagikan dua objek BigDecimal (a dan b ). Walau bagaimanapun, operasi ini menghasilkan pengecualian berikut:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
Untuk membongkar pengecualian ini, kita mesti menyelidiki butiran rumit aritmetik BigDecimal.
Intipati Aritmetik Tepat
Seperti yang dinyatakan dalam dokumentasi Java 11 BigDecimal, apabila Ketepatan objek MathContext ditetapkan kepada 0 (cth., MathContext.UNLIMITED), operasi aritmetik (termasuk pembahagian tanpa MathContext) menghasilkan keputusan yang tepat. Ini adalah satu-satunya gelagat dalam keluaran pra-5.
Peluasan dan Ketepatan Perpuluhan Tak Terhingga
Akibat daripada pengiraan keputusan tepat, tetapan mod pembundaran bagi objek MathContext dengan ketepatan 0 menjadi tidak relevan. Untuk operasi bahagi, hasil bahagi mungkin mempunyai pengembangan perpuluhan tak terhingga, seperti 1 dibahagikan dengan 3.
Mengendalikan Pengembangan Tidak Menamatkan
Jika hasil bahagi mempunyai bukan -menamatkan pengembangan perpuluhan dan operasi diperlukan untuk mengembalikan hasil yang tepat, ArithmeticException dilemparkan. Sebaliknya, hasil bagi tepat dikembalikan jika hasilnya adalah terhingga.
Penyelesaian untuk Bahagian Tidak Penamat
Untuk membetulkan isu ini, anda boleh menggunakan kaedah seperti ini:
a.divide(b, 2, RoundingMode.HALF_UP)
Di sini, 2 mewakili skala dan RoundingMode.HALF_UP menentukan kaedah pembundaran.
Sumber Tambahan
Untuk pemahaman yang mendalam, rujuk dokumentasi Java 11 BigDecimal dan catatan blog yang berwawasan ini.
Atas ialah kandungan terperinci Mengapa Bahagian `BigDecimal` Melemparkan `ArithmeticException` untuk Perpuluhan Tidak Penamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!