Rumah > pembangunan bahagian belakang > C++ > Mengapa aritmetik terapung di C# menghasilkan hasil yang tidak dijangka apabila membandingkan nilai-nilai yang sama?

Mengapa aritmetik terapung di C# menghasilkan hasil yang tidak dijangka apabila membandingkan nilai-nilai yang sama?

Patricia Arquette
Lepaskan: 2025-01-31 04:12:11
asal
886 orang telah melayarinya

Why Does Floating-Point Arithmetic in C# Produce Unexpected Results When Comparing Seemingly Equal Values?

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"
    }
}
Salin selepas log masuk
output adalah counterintuitive. Kenapa? Kerana terapung 32-bit di C# mempunyai ketepatan terhad (kira-kira 23 bit penting). Pengiraan yang melibatkan

memperkenalkan kesilapan bulat. Walaupun 0.09f dan f1 kelihatan dekat, perwakilan terapung bulat mereka berbeza sedikit, menjadikan perbandingan f2 kembali f1 > f2. false

Ini menyoroti batasan kritikal: persamaan langsung atau perbandingan ketidaksamaan nombor terapung tidak boleh dipercayai. Perbezaan minit, tidak dapat dilihat oleh pemerhatian manusia, boleh menyebabkan perbandingan gagal.

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;
}
Salin selepas log masuk
Fungsi ini memeriksa jika perbezaan mutlak antara dua terapung kurang daripada yang telah ditetapkan

. 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!

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