Ini adalah masalah yang tidak spesifik untuk java. Menggunakan == untuk membandingkan dua float / ganda / angka desimal apa pun berpotensi menyebabkan masalah karena cara mereka disimpan. Pelampung presisi tunggal (sesuai standar IEEE 754) memiliki 32 bit, didistribusikan sebagai berikut:
1 bit - Masuk (0 = positif, 1 = negatif)
8 bit - Eksponen (khusus (bias-127) representasi x dalam 2 ^ x)
23 bit - Mantisa. Angka aktual yang disimpan.
Mantera inilah yang menyebabkan masalah. Ini agak seperti notasi ilmiah, hanya angka dalam basis 2 (biner) yang terlihat seperti 1,110011 x 2 ^ 5 atau yang serupa. Namun dalam biner, 1 pertama selalu 1 (kecuali untuk representasi 0)
Oleh karena itu, untuk menghemat sedikit ruang memori (pun intended), IEEE memutuskan bahwa 1 harus diasumsikan. Misalnya, mantisa 1011 benar-benar adalah 1,1011.
Ini dapat menyebabkan beberapa masalah dengan perbandingan, terutama dengan 0 karena 0 tidak mungkin diwakili secara tepat dalam float. Ini adalah alasan utama == tidak disarankan, di samping masalah matematika floating point yang dijelaskan oleh jawaban lain.
Java memiliki masalah unik karena bahasanya universal di banyak platform berbeda, yang masing-masing bisa memiliki format float unik itu sendiri. Itu membuatnya lebih penting untuk menghindari ==.
Cara yang tepat untuk membandingkan dua pelampung (bukan bahasa khusus Anda) untuk kesetaraan adalah sebagai berikut:
if(ABS(float1 - float2) < ACCEPTABLE_ERROR)
//they are approximately equal
di mana ACCEPTABLE_ERROR adalah #defined atau konstanta lainnya sama dengan 0,000000001 atau presisi apa pun yang diperlukan, seperti yang sudah disebutkan Victor.
Beberapa bahasa memiliki fungsi ini atau konstanta bawaan ini, tetapi umumnya ini adalah kebiasaan yang baik untuk dilakukan.