首頁 >後端開發 >C++ >為什麼 C# 浮點表達式的直接轉換和變數賦值會產生不同的整數結果?

為什麼 C# 浮點表達式的直接轉換和變數賦值會產生不同的整數結果?

Linda Hamilton
Linda Hamilton原創
2025-01-08 17:07:43194瀏覽

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

C# 浮點數到整數轉換的異常行為:直接轉換與變數賦值的差異

在 C# 中,將浮點數表達式的結果轉換為整數時,開發人員經常會遇到一種奇特的行為。例如,考慮以下程式碼片段:

<code class="language-csharp">int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;</code>

直覺上,speed1 和 speed2 應該有相同的值。但是,事實並非如此:speed1 等於 61,而 speed2 等於 62。

差異解釋

根本原因在於直接轉換和變數賦值之間的細微差別。在 speed1 的情況下,表達式 6.2f * 10 的結果是 61.999998 的浮點值。當隱式轉換為整數時,此值被截斷為 61。

另一方面,變數 tmp 明確地儲存 61.999998 的浮點值。當明確轉換為整數時,此值將四捨五入到最接近的整數,結果為 62。

中間精確度

當分析編譯器產生的字節碼時,這種差異變得更加有趣。在第一種情況下,表達式 6.2f * 10 直接成為中間值。在第二種情況下,編譯器將結果儲存在浮點變數中,建立一個中間步驟。

這種中間儲存的差異會影響最終結果的精確度。編譯器允許使用更高的精度中間值,即使正式類型 (float) 暗示了其他情況。在編譯器執行此操作的某些情況下,結果可能會被截斷為 61,從而導致觀察到的差異。

如何避免此問題

為了確保在這些情況下的一致性,建議在轉換為整數之前明確舍入浮點表達式,如下例所示:

<code class="language-csharp">int speed3 = (int)Math.Round(6.2f * 10);</code>

以上是為什麼 C# 浮點表達式的直接轉換和變數賦值會產生不同的整數結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn