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
Patricia Arquetteasal
2025-01-31 04:12:11887semak imbas

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:

<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); // Outputs "false"
    }
}</code>
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:

<code class="language-csharp">bool AreApproximatelyEqual(float a, float b, float tolerance)
{
    return Math.Abs(a - b) < tolerance;
}</code>
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:
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