c# aritmetik terapung-titik: ketepatan dan perangkap perbandingan
aritmetik terapung C#C Ini boleh membawa kepada hasil yang tidak dijangka apabila membandingkan nilai -nilai yang seolah -olah sama.Pertimbangkan contoh ini:
class Program { static void Main(string[] args) { float f1 = 0.09f * 100f; float f2 = 0.09f * 99.999999f; Console.WriteLine(f1 > f2); // Outputs "false" } }
memperkenalkan kesilapan bulat. Walaupun 0.09f
dan f1
kelihatan dekat, perwakilan terapung bulat mereka berbeza sedikit, menjadikan perbandingan f2
kembali f1 > f2
. false
Untuk mengelakkan masalah ini, elakkan pemeriksaan kesamaan langsung. Sebaliknya, gunakan perbandingan berasaskan toleransi:
bool AreApproximatelyEqual(float a, float b, float tolerance) { return Math.Abs(a - b) < tolerance; }
. Memilih tolerance
yang sesuai bergantung kepada konteks dan tahap ketepatan yang diharapkan. Untuk ketepatan yang lebih tinggi, pertimbangkan untuk menggunakan tolerance
bukan double
. Walau bagaimanapun, walaupun float
tertakluk kepada batasan yang sama, walaupun dengan ketepatan yang lebih besar. double
Atas ialah kandungan terperinci Mengapa aritmetik terapung di C# menghasilkan hasil yang tidak dijangka apabila membandingkan nilai-nilai yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!