Rumah >pembangunan bahagian belakang >C++ >Mengapa `x == 0.1` Tidak Berfungsi dengan `double x = 0.1` dalam C#?

Mengapa `x == 0.1` Tidak Berfungsi dengan `double x = 0.1` dalam C#?

Susan Sarandon
Susan Sarandonasal
2025-01-22 20:51:13716semak imbas

Why Doesn't `x == 0.1` Work with `double x = 0.1` in C#?

Perbandingan Nombor Titik Terapung dalam C#: Dilema Perpuluhan

Dalam C#, anda mungkin menghadapi beberapa masalah apabila membandingkan nilai jenis double. Pertimbangkan kod berikut:

<code class="language-csharp">double x = 0.1;
if (x == 0.1)
{
    // ...
}</code>

Anehnya, kod ini tidak memasukkan pernyataan if. kenapa ni?

Masalah nombor titik terapung

Punca masalah terletak pada cara komputer mewakili nombor titik terapung (khususnya double). Tidak seperti integer, double menggunakan pecahan binari dan bukannya pecahan perpuluhan. Ini bermakna beberapa nilai perpuluhan, seperti 0.1, tidak boleh disimpan dengan tepat.

Sebagai contoh, dalam tatatanda binari, 0.1 diwakili sebagai 0.000110011001100110011001.... Komputer memotong gelung perpuluhan tak terhingga ini kepada perwakilan terhingga, yang mungkin tidak sepadan dengan nilai yang dijangkakan.

Penyelesaian

Untuk menyelesaikan masalah ini, anda boleh mempertimbangkan kaedah berikut:

  • Menggunakan jenis decimal: Jenis decimal menyimpan nombor menggunakan tatatanda perpuluhan, membenarkan perwakilan yang tepat.
  • Perbandingan Epsilon: Gunakan margin ralat kecil (cth. Math.Abs(x - 0.1)) untuk membandingkan nombor titik terapung.

Penjelasan sebab

Pecahan perduaan berbeza daripada pecahan perpuluhan dalam keupayaannya untuk mewakili nombor tertentu. Sebagai contoh, nombor 1/10 tidak boleh diwakili tepat dalam binari, menyebabkan pengembangan binarinya lebih kurang 0.0001100... Proses pembundaran komputer memperkenalkan ketidaktepatan apabila menyimpan nombor titik terapung.

Atas ialah kandungan terperinci Mengapa `x == 0.1` Tidak Berfungsi dengan `double x = 0.1` dalam C#?. 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