Ungkapan Titik Terapung C#: Menganalisis Perbezaan antara Penukaran Jenis Paksa dan Tugasan Pembolehubah
Dalam C#, ungkapan aritmetik titik terapung yang kelihatan mudah boleh membawa kepada hasil yang tidak dijangka. Artikel ini menyelidiki isu ini dan menjelaskan sebab asas perbezaan yang diperhatikan.
Huraian Masalah
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, kami menjangkakan speed1
dan speed2
mempunyai nilai yang sama, kedua-duanya mewakili 6.2f darab 10. Walau bagaimanapun, pada hakikatnya, kedua-dua pembolehubah mempunyai nilai yang berbeza:
<code>speed1 = 61 speed2 = 62</code>
Perbezaan ini menimbulkan persoalan: Mengapa operasi yang kelihatan serupa ini menghasilkan hasil yang berbeza?
Penjelasan
Untuk memahami sebab di sebalik tingkah laku ini, seseorang mesti menyelidiki kehalusan aritmetik titik terapung C#.
Dalam ungkapan pertama (int)(6.2f * 10)
, hasil pendaraban 6.2f * 10
dianggap sebagai nombor titik terapung berketepatan dua kali (64 bit) sebelum ditukar kepada integer (32 bit). Penukaran ini memotong bahagian pecahan gandaan, menghasilkan keputusan 61.
Dalam ungkapan kedua float tmp = 6.2f * 10
, hasil pendaraban disimpan dalam pembolehubah apungan (tmp) dengan ketepatan 32-bit. Apabila tmp
ditukar kepada integer, nombor titik terapung dibundarkan kepada integer terdekat, menghasilkan 62.
Pengoptimuman Pengkompil
Perlu diperhatikan bahawa pengkompil C# mengoptimumkan kod atas sebab prestasi. Dalam kes (int)(6.2f * 10)
, pengkompil boleh memilih untuk mengekalkan nilai perantaraan sebagai dua kali ganda, mengakibatkan kehilangan ketepatan semasa pelakon. Walau bagaimanapun, dalam kes float tmp = 6.2f * 10
, pengkompil mesti membundarkan hasil kepada nilai apungan terdekat sebelum menyimpannya dalam pembolehubah, menghasilkan perbezaan dalam keputusan.
Lebih banyak cerapan
Untuk menggambarkannya dengan lebih jelas, mari kita pertimbangkan latihan berikut:
<code class="language-csharp">double d = 6.2f * 10; int tmp2 = (int)d; // 计算 tmp2</code>
Dalam contoh ini, nilai tmp2
ialah 62 kerana hasil pendaraban disimpan dalam pembolehubah berganda sebelum ditukar kepada integer, dan jenis data berganda mempunyai ketepatan yang mencukupi untuk mewakili 6.2f * 10 tanpa Akan ada kehilangan ketepatan yang ketara.
Kesimpulan
Memahami sifat aritmetik titik terapung dalam C# adalah penting untuk mengelakkan hasil yang tidak dijangka. Dengan mempertimbangkan kehalusan proses pemutus dan pembundaran, pembangun boleh menulis kod yang berkelakuan seperti yang diharapkan dan mengelakkan kemungkinan ralat.
Atas ialah kandungan terperinci Mengapa Penghantaran dan Tugasan Pembolehubah Menghasilkan Keputusan Berbeza dalam Ungkapan Titik Terapung C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!