Rumah  >  Artikel  >  Java  >  Mengapa Bahagian `BigDecimal` Melemparkan `ArithmeticException` untuk Perpuluhan Tidak Penamat?

Mengapa Bahagian `BigDecimal` Melemparkan `ArithmeticException` untuk Perpuluhan Tidak Penamat?

Barbara Streisand
Barbara Streisandasal
2024-11-12 14:02:01904semak imbas

Why Does `BigDecimal` Division Throw an `ArithmeticException` for Non-Terminating Decimals?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn