C# double
Perbandingan: Isu Ketepatan
Bekerja dengan nombor titik terapung (seperti jenis double
C#) selalunya memberikan cabaran yang tidak dijangka apabila membandingkan nilai. Contoh biasa ialah membandingkan pembolehubah double
kepada 0.1:
<code class="language-csharp">double x = 0.1; if (x == 0.1) { /* Code */ }</code>
Perbandingan yang kelihatan mudah ini mungkin gagal secara mengejutkan.
Memahami Masalah: Perwakilan Perduaan lwn Perpuluhan
Punca utama terletak pada cara nombor terapung disimpan. Nilai double
disimpan sebagai pecahan binari, bukan pecahan perpuluhan. Ini bermakna bahawa banyak nilai perpuluhan, termasuk 0.1, tidak boleh diwakili dengan tepat sebagai pecahan binari. Sebaliknya, komputer menyimpan anggaran, membawa kepada perbezaan halus yang menjejaskan perbandingan.
Penyelesaian: Menggunakan decimal
Jenis Data
Untuk mengelakkan isu ketepatan ini, gunakan decimal
jenis data. Nilai decimal
disimpan menggunakan tatatanda perpuluhan, membenarkan perwakilan tepat nombor seperti 0.1.
<code class="language-csharp">decimal x = 0.1m; if (x == 0.1m) { /* Code */ }</code>
Menggunakan decimal
memastikan storan dan perbandingan 0.1 yang tepat.
Perwakilan Titik Terapung: Pandangan Lebih Dalam
Untuk menggambarkan masalah, pertimbangkan perwakilan perpuluhan. 12.34 ialah:
<code>1 * 10^1 + 2 * 10^0 + 3 * 10^-1 + 4 * 10^-2</code>
Begitu juga, 0.1 ialah:
<code>1 * 10^-1</code>
Walau bagaimanapun, dalam perduaan, sesetengah nombor (seperti 1/10, atau 0.1 perpuluhan) tidak mempunyai perwakilan yang tepat. Mereka dianggarkan, yang membawa kepada percanggahan yang menyebabkan hasil yang tidak dijangka dalam perbandingan. Anggaran ini adalah sebab x == 0.1
mungkin gagal apabila x
ialah double
.
Atas ialah kandungan terperinci Mengapa `x == 0.1` Tidak Sentiasa Berfungsi dengan Jenis Data `double` C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!