使用Math.Round时的四舍五入问题

4
Module Module1
Public Sub Main()
    Dim values() As Double = {43.523, 12.65, 43.565}
    For Each value As Double In values
        Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2))
    Next
    Console.ReadLine()
End Sub
End Module

上面的代码结果如下:
  • 43.523 --> 43.52

  • 12.65 --> 12.65

  • 43.565 --> 43.56

我需要将43.565 --> 43.57,而不是43.565 --> 43.56。但我仍然需要将其他的43.523 --> 43.52和12.65 --> 12.65四舍五入保留原样。

但请注意“由于将十进制值表示为浮点数或在浮点值上执行算术运算可能导致精度丢失,在某些情况下,Round(Double, Int32, MidpointRounding)方法可能看起来不会按照模式参数指定的方式舍入中点值。”对于Round(43.565,2,mode),它确实如此,因为尽管最接近43.565的Double比它小,但乘以100得到的结果恰好是4356.5,所以被舍入为整数的值就是一个中点。但是对于2.135,您得到了2.13,因为舍入后的值不是中点。 - Daniel Fischer
4个回答

8

如果你关注精确的小数值,建议使用Decimal替代Double。特别地,43.565在Double中并不能被准确表示。

然而,如果你想指定“中间值”(即可以合理地四舍五入或舍去)的行为,请使用带有MidpointRounding参数的重载方法

Console.WriteLine("{0} --> {1}", value, _
                  Math.Round(value, 2, MidpointRounding.AwayFromZero))

4

您可以使用:

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

详情请参见接受MidpointRounding的Math.Round重载文档


1

请查看MidpointRounding参数:

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

应该给你 43.57


1

使用

Math.Round(value, 2, System.MidpointRounding.AwayFromZero)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接