Rumah > Java > javaTutorial > Mengapa menggunakan `==` untuk perbandingan kesamaan apungan di Jawa tidak boleh dipercayai dan apakah pendekatan yang betul?

Mengapa menggunakan `==` untuk perbandingan kesamaan apungan di Jawa tidak boleh dipercayai dan apakah pendekatan yang betul?

DDD
Lepaskan: 2024-12-23 14:13:15
asal
165 orang telah melayarinya

Why is using `==` for float equality comparison in Java unreliable and what's the correct approach?

Perangkap Perbandingan Kesamaan Terapung dengan == di Jawa

Java menyediakan operator == untuk perbandingan kesamaan, termasuk nombor titik terapung. Walau bagaimanapun, menggunakan == untuk membandingkan terapung boleh membawa kepada keputusan yang mengejutkan dan tidak boleh dipercayai.

Bertentangan dengan maklumat yang diberikan pada halaman Java.sun, menggunakan == untuk perbandingan titik terapung boleh mencetuskan amaran analisis statik seperti "JAVA0078 Nilai titik terapung berbanding dengan ==" dalam IDE. Ini kerana nombor titik terapung dalam Java diwakili menggunakan format titik terapung IEEE 754, yang memperkenalkan ketidaktepatan yang wujud.

Disebabkan oleh pengehadan dalam ketepatan titik terapung, nilai titik terapung disimpan sebagai anggaran. Operasi seperti penambahan, penolakan dan perbandingan memperkenalkan ralat pembundaran yang terkumpul dari semasa ke semasa. Akibatnya, perbandingan langsung menggunakan == mungkin mengembalikan palsu walaupun pada asasnya nombornya sama.

Pendekatan Betul: Perbandingan Berasaskan Epsilon

Untuk membandingkan dengan pasti terapung- nilai mata dalam Java, pendekatan yang disyorkan ialah menggunakan perbandingan berasaskan epsilon. Daripada menguji kesamaan tepat menggunakan ==, kami menyemak sama ada perbezaan mutlak antara dua nombor adalah kurang daripada nilai ambang kecil yang dipanggil epsilon.

Coretan kod di bawah menunjukkan cara yang betul untuk membandingkan apungan:

if (Math.abs(sectionID - currentSectionID) < epsilon)
Salin selepas log masuk

Di sini, epsilon ialah nombor yang sangat kecil yang telah ditetapkan (mis., 0.00000001) yang mentakrifkan julat sisihan yang boleh diterima untuk kesaksamaan. Pendekatan ini dengan berkesan membolehkan margin ralat yang kecil disebabkan oleh ketidaktepatan titik terapung, memastikan pemeriksaan kesaksamaan yang boleh dipercayai.

Atas ialah kandungan terperinci Mengapa menggunakan `==` untuk perbandingan kesamaan apungan di Jawa tidak boleh dipercayai dan apakah pendekatan yang betul?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan