Rumah > Java > javaTutorial > Mengapa Java's Double Menghasilkan Pembundaran Tidak Tepat, dan Bagaimana BigDecimal Boleh Menyelesaikannya?

Mengapa Java's Double Menghasilkan Pembundaran Tidak Tepat, dan Bagaimana BigDecimal Boleh Menyelesaikannya?

Patricia Arquette
Lepaskan: 2024-12-16 21:25:12
asal
634 orang telah melayarinya

Why Does Java's Double Produce Inaccurate Rounding, and How Can BigDecimal Solve It?

Cara Mengatasi Anomali Berganda Pembundaran Java

Di Java, pengiraan titik terapung kadangkala boleh mengakibatkan isu pembundaran yang tidak dijangka. Untuk menggambarkan, mari kita periksa kod berikut:

double tempCommission = targetPremium.doubleValue() * rate.doubleValue() / 100d;
double netToCompany = targetPremium.doubleValue() - tempCommission;
double dCommission = request.getPremium().doubleValue() - netToCompany;
Salin selepas log masuk

Nilai jangkaan untuk dCommission ialah 877.85, tetapi keputusan sebenar tidak tepat sedikit pada 877.8499999999999. Untuk menyelesaikan isu ini, kita perlu menggunakan pengiraan yang lebih tepat.

Penyelesaian terletak pada penggunaan java.math.BigDecimal. Kelas ini menyediakan kawalan ke atas ketepatan aritmetik titik terapung. Berikut ialah versi kod yang dikemas kini menggunakan BigDecimal:

import java.math.BigDecimal;

BigDecimal premium = BigDecimal.valueOf("1586.6");
BigDecimal netToCompany = BigDecimal.valueOf("708.75");
BigDecimal commission = premium.subtract(netToCompany);
System.out.println(commission + " = " + premium + " - " + netToCompany);
Salin selepas log masuk

Dengan BigDecimal, hasilnya menggambarkan nilai yang dijangkakan dengan tepat:

877.85 = 1586.6 - 708.75
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Java's Double Menghasilkan Pembundaran Tidak Tepat, dan Bagaimana BigDecimal Boleh Menyelesaikannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan