Gelagat luar biasa C# terapung kepada penukaran integer
Coretan kod berikut menunjukkan kelakuan tidak dijangka penukaran titik terapung kepada integer dalam C#:
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
Anehnya, speed1
mempunyai nilai 61, manakala speed2
mempunyai nilai 62, walaupun kedua-duanya menjangkakan hasilnya ialah 62. Pemeriksaan rapi mendedahkan bahawa dalam speed1
ungkapan titik terapung 6.2f * 10
secara tersirat ditukar kepada menaip double
sebelum dipotong kepada integer, menghasilkan keputusan 61.
Walau bagaimanapun, dalam speed2
, hasil 6.2f * 10
secara eksplisit diberikan kepada pembolehubah float
tmp
. Langkah perantaraan ini melibatkan pembulatan nilai kepada nilai float
yang terdekat, iaitu 62, dan kemudian menukarnya kepada integer.
Perbezaan utama antara kedua-dua operasi ialah perwakilan pertengahan. Dalam kes pertama, pengkompil mungkin memilih untuk menempah perwakilan ketepatan yang lebih tinggi untuk ungkapan titik terapung, menyebabkan pemotongan dan menghasilkan nilai 61. Walau bagaimanapun, dalam kes kedua, tugasan float
eksplisit memaksa pembundaran, menghasilkan nilai 62.
Dalam tindakan berikut:
<code class="language-csharp">double d = 6.2f * 10; int tmp2 = (int)d;</code>
d
akan menjadi jenis double
, menyebabkan double
ditukar dan nilai yang dibulatkan dipenggal kepada integer, yang biasanya menghasilkan nilai 62.
Tingkah laku yang tidak dijangka dalam penukaran ungkapan titik terapung ialah aspek halus pengendalian titik terapung C#. Memahami nuansa ini adalah penting untuk mengelakkan hasil yang tidak dijangka dan memastikan penukaran yang tepat antara jenis angka.
Atas ialah kandungan terperinci Mengapa Menghantar Ungkapan Terapung ke Integer dalam C# Menghasilkan Keputusan Berbeza Bergantung pada Kaedah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!