Tingkah laku luar biasa penukaran titik terapung C# kepada integer: perbezaan antara penukaran langsung dan penugasan pembolehubah
Dalam C#, pembangun sering menghadapi gelagat pelik apabila menukar hasil ungkapan titik terapung kepada integer. Sebagai contoh, pertimbangkan coretan 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 sepatutnya mempunyai nilai yang sama. Walau bagaimanapun, ini tidak berlaku: kelajuan1 bersamaan dengan 61 dan kelajuan2 bersamaan dengan 62.
Penjelasan perbezaan
Puncanya terletak pada perbezaan halus antara penukaran langsung dan penugasan berubah. Dalam kes kelajuan1, ungkapan 6.2f * 10 menghasilkan nilai titik terapung 61.999998. Apabila secara tersirat ditukar kepada integer, nilai ini dipotong kepada 61.
Sebaliknya, pembolehubah tmp secara eksplisit menyimpan nilai titik terapung sebanyak 61.999998. Apabila ditukar secara eksplisit kepada integer, nilai ini dibundarkan kepada integer terdekat, menghasilkan 62.
Ketepatan pertengahan
Perbezaan ini menjadi lebih menarik apabila menganalisis kod bait yang dijana oleh pengkompil. Dalam kes pertama, ungkapan 6.2f * 10 menjadi nilai perantaraan secara langsung. Dalam kes kedua, pengkompil menyimpan hasil dalam pembolehubah titik terapung, mewujudkan langkah perantaraan.
Perbezaan dalam storan perantaraan ini menjejaskan ketepatan keputusan akhir. Pengkompil membenarkan nilai perantaraan ketepatan yang lebih tinggi digunakan, walaupun jenis formal (float) membayangkan sebaliknya. Dalam sesetengah kes di mana pengkompil melakukan ini, hasilnya mungkin dipotong kepada 61, menyebabkan perbezaan yang diperhatikan.
Bagaimana untuk mengelakkan masalah ini
Untuk memastikan ketekalan dalam kes ini, adalah disyorkan untuk membundarkan ungkapan titik terapung secara eksplisit sebelum menukar kepada integer, seperti dalam contoh berikut:
<code class="language-csharp">int speed3 = (int)Math.Round(6.2f * 10);</code>
Atas ialah kandungan terperinci Mengapa Hantaran Terus dan Tugasan Pembolehubah bagi Ungkapan Terapung C# Menghasilkan Keputusan Integer Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!