Rumah >pembangunan bahagian belakang >C++ >Mengapa Menghantar Ungkapan Terapung C# ke Int Menghasilkan Keputusan Yang Tidak Dijangka?
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!