Memahami Perbandingan Ketepatan Berganda dalam C#
Masalah:
Perbandingan langsung double
pembolehubah dalam C# boleh menghasilkan hasil yang tidak dijangka. Contohnya, if (x == 0.1)
mungkin menilai kepada false
walaupun apabila x
diberikan nilai 0.1
.
Punca Punca:
Isu ini berpunca daripada cara nombor titik terapung (seperti float
dan double
) diwakili dalam ingatan komputer. Mereka menggunakan perwakilan pecahan binari, tidak seperti perwakilan pecahan perpuluhan yang biasa kita lakukan. Ini bermakna bahawa banyak nilai perpuluhan, seperti 0.1, tidak boleh diwakili dengan tepat dalam binari. Anggaran yang terhasil memperkenalkan ralat pembundaran yang halus.
Penyelesaian:
Penyelesaian yang paling berkesan ialah menggunakan decimal
jenis data apabila ketepatan adalah diutamakan. decimal
menggunakan perwakilan pecahan perpuluhan, mampu menyimpan nilai dengan tepat seperti 0.1.
Butiran Lanjut:
Pecahan perduaan, serupa dengan pecahan perpuluhan, menggunakan kuasa 2 dan bukannya kuasa 10. Sama seperti 1/3 (0.3333...) tidak boleh diwakili dengan tepat dalam perpuluhan, 1/10 (0.1) tidak mempunyai perwakilan binari yang tepat . Had yang wujud ini membawa kepada ralat pembundaran yang menyebabkan percanggahan perbandingan. Komputer menyimpan anggaran hampir 0.1, tetapi anggaran ini tidak betul-betul sama dengan 0.1 literal yang digunakan dalam perbandingan.
Atas ialah kandungan terperinci Mengapa Membandingkan Nilai Berganda dalam C# Kadangkala Mengembalikan Palsu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!