Rumah > pembangunan bahagian belakang > C++ > Mengapa Penghantaran dan Tugasan Pembolehubah Menghasilkan Keputusan Berbeza dalam Ungkapan Titik Terapung C#?

Mengapa Penghantaran dan Tugasan Pembolehubah Menghasilkan Keputusan Berbeza dalam Ungkapan Titik Terapung C#?

Mary-Kate Olsen
Lepaskan: 2025-01-08 17:17:41
asal
319 orang telah melayarinya

Why Do Casting and Variable Assignment Produce Different Results in C# Floating-Point Expressions?

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

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

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

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!

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