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:
decimal
: Jenis decimal
menyimpan nombor menggunakan tatatanda perpuluhan, membenarkan perwakilan yang tepat. 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!