Rumah > pembangunan bahagian belakang > C++ > Mengapa perbandingan titik terapung di C# kadang -kadang menghasilkan hasil yang tidak dijangka?

Mengapa perbandingan titik terapung di C# kadang -kadang menghasilkan hasil yang tidak dijangka?

Mary-Kate Olsen
Lepaskan: 2025-01-31 04:07:36
asal
559 orang telah melayarinya

Why Do Floating Point Comparisons in C# Sometimes Yield Unexpected Results?

c# Dalam banyak bahasa pengaturcaraan seperti C#, bilangan titik terapung digunakan untuk mewakili perpuluhan. Walau bagaimanapun, disebabkan oleh perwakilan terhad nombor terapung di dalam komputer, nombor ini mempunyai masalah ketepatan.

Pertimbangkan prosedur berikut:

output program ini palsu, yang nampaknya bercanggah dengan 0.09
class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f * 100f;
        float f2 = 0.09f * 99.999999f;

        Console.WriteLine(f1 > f2);
    }
}
Salin selepas log masuk
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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan