Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah membandingkan nilai `float` dan `double` kadangkala mengembalikan `palsu` walaupun ia kelihatan sama?

Mengapakah membandingkan nilai `float` dan `double` kadangkala mengembalikan `palsu` walaupun ia kelihatan sama?

Barbara Streisand
Barbara Streisandasal
2024-11-01 18:19:30672semak imbas

Why does comparing `float` and `double` values sometimes return `false` even when they appear identical?

Hasil Tidak Dijangka Apabila Membandingkan Jenis Data Berganda dan Terapung

Apabila membandingkan nombor titik terapung berketepatan ganda (berganda) kepada titik terapung ketepatan tunggal nombor (terapung), anda mungkin menghadapi keputusan yang tidak dijangka. Secara khusus, semakan kesamaan (f == d) antara pembolehubah apungan f dan pembolehubah berganda d mungkin mengembalikan palsu walaupun kedua-dua nilai kelihatan sama.

Tingkah laku ini berpunca daripada dua faktor asas yang dikaitkan dengan terapung- nombor titik: ketepatan dan pembundaran.

Ralat Ketepatan dan Pembundaran

  • Ketepatan: Nombor titik terapung menyimpan bilangan digit yang terhad , yang menentukan ketepatan nilai yang boleh mereka wakili. Nombor tertentu, seperti 1/3 dalam perpuluhan, mempunyai perwakilan perpuluhan tak terhingga dan tidak boleh disimpan dengan tepat tanpa kehilangan ketepatan.
  • Pembulatan: Apabila nilai titik terapung ditukar kepada binari, ia mungkin tidak dapat mewakili nilai perpuluhan tertentu dengan tepat. Sebagai contoh, 0.1 dalam perpuluhan diwakili dalam perduaan sebagai urutan digit yang tidak terhingga. Akibatnya, nombor titik terapung menjalani penggenapan untuk dimuatkan dalam 有限 mereka.

Implikasi untuk Pemeriksaan Kesaksamaan

Ketepatan dan pembundaran yang wujud dalam terapung- nombor mata boleh membawa kepada ralat pembundaran, terutamanya apabila membandingkan nilai yang sangat hampir antara satu sama lain. Ralat ini terkumpul, menyebabkan perbandingan kesamaan gagal. Ini menjadikan semakan kesamaan langsung untuk nombor titik terapung tidak boleh dipercayai dan terdedah kepada negatif palsu.

Penyelesaian: Membandingkan dengan Epsilon

Daripada menggunakan semakan kesaksamaan, yang lebih dipercayai kaedah untuk membandingkan nombor titik terapung adalah dengan mengambil perbezaan mutlak antara mereka dan menyemak sama ada ia berada di bawah nilai kecil yang dikenali sebagai epsilon (ε). Ini membolehkan anda mengambil kira ralat pembundaran dan menentukan sama ada perbezaan itu tidak penting untuk aplikasi anda.

if (abs(x - y) < epsilon)

Atas ialah kandungan terperinci Mengapakah membandingkan nilai `float` dan `double` kadangkala mengembalikan `palsu` walaupun ia kelihatan sama?. 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