.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 的結果。
以上是.NET 中的雙重乘法是否有問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!