簡體   English   中英

需要幫助舍入到小數點后兩位

[英]Need help rounding to 2 decimal places

為什么當我做以下事情時......

Math.Round(0.75, 1, MidpointRounding.AwayFromZero)

我得到0.8

但是當我做以下事情時......

Math.Round(0.575, 2, MidpointRounding.AwayFromZero)

我不懂0.58。 相反,我得到0.57。 我想要任何5和更高的東西,所以0.575應該是0.58。

問題是你不能將0.575完全表示為二進制浮點數(例如雙精度)。 雖然我不確切地知道最接近的表示可能只是稍微低一點,因此在舍入時使用真實表示並向下舍入。

如果要避免此問題,請使用更合適的數據類型。 decimal將做你想要的:

Math.Round(0.575M, 2, MidpointRounding.AwayFromZero)

結果: 0.58

0.75做正確的事情的原因是它很容易用二進制浮點表示,因為它是簡單的1/2 + 1/4(即2 ^ -1 + 2 ^ -2)。 通常,任何有限的2的冪的和可以用二進制浮點表示。 例外情況是當你的2的冪超過一個范圍時(例如2 ^ 100 + 2不能完全表示)。

編輯添加:

在理解為什么它很難理解0.575不是真正的0.575時, 格式化C#輸出的雙精度可能是有意義的。 接受的答案中的DoubleConverter將顯示0.575作為精確字符串是0.5749999999999999555910790149937383830547332763671875您可以從中看到為什么舍入給出0.57。

System.Math.Round方法使用Double結構,正如其他人所指出的那樣,它容易出現浮點精度錯誤。 簡單的解決方案, 發現這個問題時,我遇到的是使用System.Decimal.Round方法,它不會有同樣的問題,並不需要redifining您的變量小數:

Decimal.Round(0.575, 2, MidpointRounding.AwayFromZero)

結果:0.58

它是由於雙精度/小數的精度不足造成的(即 - 函數不會總是給出你期望的結果)。

請參閱以下鏈接: Math.Round上的MSDN

這是相關的引用:

由於將十進制值表示為浮點數或對浮點值執行算術運算可能導致精度損失,因此在某些情況下,Round(Double,Int32,MidpointRounding)方法可能看起來不像指定的那樣舍入中點值通過模式參數說明。這在下面的示例中說明,其中2.135舍入到2.13而不是2.14。這是因為內部方法將值乘以10digits,並且在這種情況下乘法運算會受到精度損失的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM