Membandingkan Nilai Titik Terapung: Perangkap Kesaksamaan dalam Java
Walaupun dokumentasi Java menunjukkan bahawa == berfungsi sebagai pengendali kesamaan untuk terapung- nombor mata, menggunakannya untuk perbandingan boleh menimbulkan kebimbangan. Seperti yang digambarkan oleh contoh:
if(sectionID == currentSectionID)
menyebut analisis statik mencetuskan ralat, "JAVA0078 Nilai titik terapung berbanding dengan ==". Sebabnya terletak pada batasan yang wujud bagi perwakilan titik terapung binari.
Membandingkan nilai titik terapung dengan == adalah serupa dengan membandingkan epal dengan oren. Oleh kerana nilai ini adalah anggaran dan bukannya perwakilan tepat, malah nilai yang sama mungkin menghasilkan perwakilan binari yang berbeza. Akibatnya, == menyemak kandungan alamat memori pembolehubah dan bukan nilai titik terapung yang mendasari.
Pendekatan yang Betul
Untuk menangani isu ini, pendekatan yang disyorkan ialah membandingkan nilai titik terapung berdasarkan ambang toleransi. Ujian 'kesamaan' menjadi:
if(Math.abs(sectionID - currentSectionID) < epsilon)
di mana epsilon mewakili nombor kecil seperti 0.00000001, disesuaikan dengan tahap ketepatan yang diingini. Kaedah ini menilai sama ada perbezaan mutlak antara dua nilai titik terapung adalah kurang daripada epsilon ambang. Jika ya, mereka dianggap 'sama' dalam toleransi yang ditentukan.
Kesimpulannya
Walaupun operator == menyediakan cara yang mudah untuk membandingkan nilai titik terapung, kekurangannya memerlukan berhati-hati. Untuk mengelakkan ketidaktepatan dan perbandingan yang tidak boleh dipercayai, amalan pilihan adalah memanfaatkan pendekatan berasaskan toleransi yang disebutkan di atas, memastikan ketepatan dan kebolehpercayaan dalam perbandingan titik terapung.
Atas ialah kandungan terperinci Mengapa Menggunakan `==` untuk Membandingkan Nombor Titik Terapung dalam Java Bermasalah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!