Rumah >pembangunan bahagian belakang >C++ >Mengapa perbandingan titik terapung di C# kadang -kadang menghasilkan hasil yang tidak dijangka?
Pertimbangkan prosedur berikut:
output program ini palsu, yang nampaknya bercanggah dengan 0.09
<code class="language-csharp">class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); } }</code>100 lebih besar daripada 0.09
99.999999. memahami masalah ketepatan
Sebab ketepatan ini adalah cara nombor titik terapung dinyatakan dalam ingatan. Penyimpanan digital ini adalah gabungan nombor ekor (bahagian perpuluhan), indeks (kuasa asas) dan simbol. Walau bagaimanapun, ketepatan nombor ekor adalah terhad.
Dalam C#, nombor titik terapung tunggal (float) mempunyai 23 digit, dan nombor titik terapung dwi (double) mempunyai nombor ekor 52 -bit. Apabila nombor akhir tidak dapat dinyatakan dengan tepat, ia memasuki empat rumah dan lima yang paling dekat untuk mewakili nombor.Dalam contoh di atas, ketepatan 0.09
100 ialah 9.00000000190734863, tetapi kerana ketepatannya terhad, ia diwakili oleh 32 -bit float hingga 9.0. Begitu juga, 0.09 99.999999 Empat rumah dan lima dalam -five adalah 9.0. Akibatnya, kedua -dua nilai ini agak sama dan output program palsu.
Untuk mengurangkan ketepatan ini, IEEE 754 Floating -point Operasi Standard memperkenalkan konsep "Epsilon", yang bermaksud bahawa ia boleh ditambah kepada 1.0 tanpa mengubah titik minimum ke hadapan. Dalam C#, nilai ini adalah kira-kira 1.4013E-45. Dengan membandingkan perbezaan antara kedua -dua nombor terapung dengan epsilon, ia dapat ditentukan sama ada ia sah untuk kesahihan mereka dalam julat ketepatan titik terapung.
Atas ialah kandungan terperinci Mengapa perbandingan titik terapung di C# kadang -kadang menghasilkan hasil yang tidak dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!