VB.Net中的Math.Round()有什么问题?

时间:2013-02-12 14:38:55

标签: vb.net

我在VB.Net中的Math.Round函数中遇到了一个奇怪的案例

Math.Round((32.625), 2)

结果:32.62

Math.Round((32.635), 2)

结果:32.64

我需要 32.63 ,但在这些情况下,该功能的工作原理不同。

我可以得到小数部分,然后做我想做的事情。但是这不是太奇怪,一个是向上走向更高,一个是四舍五入到更低。

那么如何从 32.625 获得 32.63 而不会弄乱小数部分? (作为数学的自然逻辑)

5 个答案:

答案 0 :(得分:35)

Math.Round默认使用银行家的舍入。您可以通过指定其他MidPointRounding选项来更改它。来自MSDN

圆满结束

  

中点值四舍五入到远离零的下一个数字。对于   例如,3.75轮到3.8,3.85轮到3.9,-3.75轮到-3.8,   和-3.85回合到-3.9。这种舍入形式由   MidpointRounding.AwayFromZero枚举成员。离开   零是最广为人知的舍入形式。

四舍五入到最近,或银行家的四舍五入

  

中点值四舍五入到最接近的偶数。例如,   3.75和3.85回合均为3.8,并且-3.75和-3.85回合均为   -3.8。这种舍入形式由MidpointRounding.ToEven枚举成员表示。

     

舍入到最近是财务中使用的舍入的标准形式   和统计业务。它符合IEEE标准754部分   4.当在多个舍入操作中使用时,它减少了由于始终舍入a中的中点值而导致的舍入误差   单向。在某些情况下,这种舍入错误可能是   显著。

所以,你想要的是:

Math.Round(32.625, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635, 2, MidpointRounding.AwayFromZero)

正如其他人所提到的,如果精度很重要,那么您应该使用Decimal变量而不是浮点类型。例如:

Math.Round(32.625D, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635D, 2, MidpointRounding.AwayFromZero)

答案 1 :(得分:3)

试试这个(从内存中):

Math.Round((32.635), 2, MidPointRounding.AwayFromZero)

答案 2 :(得分:2)

试试这个。

Dim d As Decimal = 3.625
    Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
    MsgBox(r)

这应该做你想要的。

答案 3 :(得分:2)

她可以添加一个快速功能,以简化您的生活并使其成为您不必一直打字的原因。

 Private Function roundd(dec As Decimal)
    Dim d As Decimal = dec
    Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
    Return r
End Function

将此添加到您的应用程序,然后使用函数

roundd(3.624)

或任何你需要的东西。

显示结果 - 示例

msgbox(roundd(3.625))

这将显示一个3.63

的消息框
Textbox1.text = roundd(3.625)

这将设置textbox1.text - 3.63等。 因此,如果您需要对一个以上的数字进行舍入,那么它将不会那么繁琐,您可以节省大量的输入。

希望这会有所帮助。

答案 4 :(得分:-1)

你不能使用像VB.Net那样处理像32.625这样的数字的浮点数。 (还有@StevenDoggart提到的银行家四舍五入的问题 - 你可能不得不处理这两个问题。)

问题是存储的数字并不完全是输入的数字,因为这些数字不是固定的二进制表示,例如32.625存储为32.62499997,32.635存储为32.63500001 唯一的方法是将数字存储为Decimal

类型
DIM num as Decimal
num = ToDecimal("32.625")