Rumah >pembangunan bahagian belakang >C++ >Mengapa pengiraan terapung di C# tidak tepat?
Memahami ketepatan titik terapung di C#
ketepatan aritmetik terapung-point yang melampaui aritmetik sering membawa kepada hasil yang tidak dijangka. Pertimbangkan coretan kod C# ini:
<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); // Surprisingly prints "false" } }</code>output, "palsu," adalah tidak bertentangan, kerana kedua -dua pengiraan kelihatan menghasilkan 9.0. Percanggahan ini timbul dari batasan perwakilan terapung.
IEEE 754 Nombor point floating standard Gunakan bilangan bit terhingga untuk mewakili bahagian pecahan. Ini bermakna banyak nilai perpuluhan tidak dapat disimpan dengan tepat; mereka dianggarkan. Nilai
dan hasil pengiraan adalah penghampiran. Penghampiran ini, sementara sering tidak penting, boleh menyebabkan perbandingan yang tidak dijangka. 0.09f
Oleh itu, secara langsung membandingkan nombor terapung untuk kesamaan (
==
<code class="language-csharp">Console.WriteLine(Math.Abs(f1 - f2) < 0.0001); // A more robust comparison</code>dan
berada di bawah ambang yang telah ditetapkan (0.0001 dalam kes ini). Laraskan ambang berdasarkan ketepatan aplikasi anda yang diperlukan. f1
f2
Sebagai alternatif, menggunakan
(satu ketepatan), mengurangkan kemungkinan ketidaktepatan ini. Walau bagaimanapun, walaupun nilai double
tertakluk kepada batasan yang sama, walaupun dengan margin kesilapan yang lebih kecil. Pertimbangan yang teliti terhadap keperluan ketepatan adalah penting untuk pengiraan titik terapung yang boleh dipercayai. float
Atas ialah kandungan terperinci Mengapa pengiraan terapung di C# tidak tepat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!