Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Membandingkan Nilai Berganda dalam Java dengan Selamat untuk Mengelakkan Ralat Ketepatan?

Bagaimanakah Saya Boleh Membandingkan Nilai Berganda dalam Java dengan Selamat untuk Mengelakkan Ralat Ketepatan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-30 19:52:10660semak imbas

How Can I Safely Compare Double Values in Java to Avoid Precision Errors?

Bahaya Ketepatan Perbandingan Berganda di Jawa dan Penyelesaiannya

Membandingkan nilai berganda di Jawa boleh menjadi tugas yang mengelirukan. Perbandingan naif, seperti yang digambarkan di bawah, mungkin menghasilkan keputusan yang tidak dijangka disebabkan oleh pengehadan ketepatan titik terapung:

double a = 1.000001;
double b = 0.000001;

if ((a-b) == 1.0) {
  // This condition evaluates to false, though it seemingly should be true.
}

Isu timbul kerana penolakan a-b tidak mengembalikan tepat 1.0, tetapi nilai yang sangat hampir dengannya. Aritmetik titik terapung boleh memperkenalkan ralat pembundaran, menghasilkan nilai 0.9999999999999999, yang tidak bersamaan dengan 1.0.

Untuk mengelakkan perangkap ini, adalah disyorkan untuk menggunakan perbandingan anggaran dan bukannya perbandingan yang tepat. Kaedah Math.abs() boleh digunakan untuk mengira perbezaan mutlak antara hasil sebenar dan nilai yang dijangkakan, dan perbezaan ini boleh dibandingkan dengan nilai toleransi yang kecil:

double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {
  // This condition evaluates to true, as the absolute difference is small enough.
}

Dengan menetapkan toleransi yang sesuai nilai, anda boleh mengawal tahap ketepatan yang boleh diterima untuk perbandingan. Pendekatan ini membolehkan anda mengendalikan had ketepatan titik terapung dengan berkesan dan memastikan penilaian yang tepat.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membandingkan Nilai Berganda dalam Java dengan Selamat untuk Mengelakkan Ralat Ketepatan?. 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