Rumah > pembangunan bahagian belakang > C++ > Mengapa Hantaran Terus dan Tugasan Pembolehubah bagi Ungkapan Terapung C# Menghasilkan Keputusan Integer Berbeza?

Mengapa Hantaran Terus dan Tugasan Pembolehubah bagi Ungkapan Terapung C# Menghasilkan Keputusan Integer Berbeza?

Linda Hamilton
Lepaskan: 2025-01-08 17:07:43
asal
185 orang telah melayarinya

Why Do Direct Casts and Variable Assignments of C# Float Expressions Yield Different Integer Results?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan