Rumah >pembangunan bahagian belakang >C++ >Mengapa Menghantar Ungkapan Terapung C# ke Int Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapa Menghantar Ungkapan Terapung C# ke Int Menghasilkan Keputusan Yang Tidak Dijangka?

Patricia Arquette
Patricia Arquetteasal
2025-01-08 17:12:46591semak imbas

Why Does Casting a C# Float Expression to an Int Produce Unexpected Results?

Ungkapan Titik Terapung C#: Tingkah laku yang tidak dijangka dalam penukaran apungan kepada integer

Dalam C#, tingkah laku yang tidak dijangka mungkin berlaku apabila menghantar hasil ungkapan titik terapung kepada integer. Pertimbangkan kod berikut:

<code class="language-csharp">int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;</code>

Secara intuitif, speed1 dan speed2 harus mengandungi nilai yang sama. Walau bagaimanapun, keputusan sebenar ialah:

<code>speed1 = 61
speed2 = 62</code>

Anomali ini timbul daripada susunan operasi yang dilakukan. Dalam kelajuan1, hasil pendaraban (6.2f * 10) ditukar dengan serta-merta kepada integer, menghasilkan nilai terpotong 61.

Sebaliknya, dalam kelajuan2, hasil pendaraban ditetapkan kepada tmp sebagai nombor titik terapung, mencetuskan pembundaran semasa penukaran tersirat kepada titik terapung. Nilai bulat 62 ini kemudiannya ditukar kepada integer, menghasilkan keputusan yang betul.

Untuk memahami tingkah laku ini, adalah penting untuk menyedari bahawa nombor titik terapung (seperti 6.2f) bukanlah nilai matematik yang tepat, tetapi anggaran. Oleh itu, operasi aritmetik pada nombor titik terapung boleh mengakibatkan kehilangan ketepatan akibat pembundaran.

Dalam kes (int)(6.2f 10) , pengkompil boleh (sebagai pilihan) mengekalkan ketepatan 6.2f 10 walaupun hasilnya secara rasmi merupakan nombor titik terapung. Ini membolehkan hasil yang lebih tepat. Walau bagaimanapun, jika pengoptimuman ini tidak dilaksanakan, ungkapan akan dibuang ke nombor titik terapung berketepatan dua kali, mungkin mengakibatkan kehilangan ketepatan.

Sebaliknya, penetapan kepada tmp = 6.2f * 10 secara eksplisit memaksa pembundaran sebelum penukaran integer. Ini memastikan hasil yang konsisten merentas sistem yang berbeza.

Oleh itu, untuk mengelakkan pengecualian sedemikian, secara amnya disyorkan untuk menggunakan fungsi pembundaran eksplisit, seperti Math.Round, apabila menukar nombor titik terapung kepada integer.

Atas ialah kandungan terperinci Mengapa Menghantar Ungkapan Terapung C# ke Int Menghasilkan Keputusan Yang Tidak Dijangka?. 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