Dot-Net

.Net 舍入問題

  • October 19, 2010

我在.Net 內部有一個舍入問題。

我將一個 3 位數的數字四捨五入到兩位數,這會導致一個數字出現一些問題。

如果我嘗試將 34.425 舍入到小數點後兩位,它應該舍入到 34.43。我正在使用 roundawayfromzero 選項,到目前為止,它對程序中的每個數字都有效,除了這個數字。

程式碼Math.Round(34.425, 2, MidpointRounding.AwayFromZero)應該等於 34.43,但它等於 34.42。

如果我用任何其他號碼嘗試這個,它工作正常。

Math.Round(34.435, 2, MidpointRounding.AwayFromZero) = 34.44

Math.Round(34.225, 2, MidpointRounding.AwayFromZero) = 34.23

Math.Round(34.465, 2, MidpointRounding.AwayFromZero) = 34.47

我只是想看看有沒有人遇到過這個問題?

現在我已經通過將數字轉換為小數來解決這個問題。我已將程式碼更改為此,現在可以正常工作:

Math.Round(CDec(34.425), 2, MidpointRounding.AwayFromZero) = 34.43

我只是在尋找為什麼我的舊程式碼不起作用的原因。

謝謝!

將程式碼更新為正確的 AwayFromZero

浮點數從來都不是精確的,34.425 可能有一個內部表示 34.4249999999999.. 將四捨五入到 34.42。

如果您需要數字的精確表示,請使用decimal類型。

MidpointRounding.ToEven對您是否實際使用或有點困惑MidpointRounding.AwayFromZero。如果您ToEven按照第一個片段所示使用,這是預期的行為。

引用自:https://stackoverflow.com/questions/3969674