.NET 中雙精度乘法精度問題詳解
在 C# 中,表達式 double i = 10 * 0.69;
的結果是 i
被賦值為 6.8999999999999995,而不是預期的 6.9。這引發了一個問題:.NET 中的雙精度乘法是否出現了錯誤?
二進製表示和浮點數運算
要理解這種行為,必須深入了解二進製表示和浮點數運算的細微之處。浮點格式近似地將實數表示為有限的二進制值,這可能導致精度限制。
看似簡單的 0.69 無法精確地用二進製表示。它需要一個無限循環的二進制數字序列。存儲在 double
數據類型中的二進製表示是 0.69 的近似值。
編譯器優化和存儲的常量
在提供的代碼片段中,編譯器通過執行乘法並將結果作為常量存儲在可執行文件中來優化表達式。它之所以這樣做是因為這些值在編譯時是已知的。存儲的值是 6.9 的浮點近似值,它略小於實際值。
解決方法和替代數據類型
為了解決這個問題並獲得更精確的結果,可以使用 decimal
數據類型,它旨在以更高的精度表示非重複十進制值。表達式 decimal i = 10m * 0.69m;
將產生 6.9m 的結果。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3