.Net舍入问题

时间:2010-10-19 14:54:15

标签: .net vb.net rounding

我在.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

5 个答案:

答案 0 :(得分:20)

浮点数从不准确,34.425可能有内部代表性34.4249999999999 ..将四舍五入至34.42。

如果您需要精确的数字表示,请使用decimal类型。

答案 1 :(得分:2)

对您是否实际使用MidpointRounding.ToEvenMidpointRounding.AwayFromZero略有疑惑。如果您使用ToEven作为第一个代码段指示,则这是预期的行为。

答案 2 :(得分:1)

您的假设和结果不正确:

Math.Round(34.225, 2, MidpointRounding.ToEven) == 34.22
Math.Round(34.465, 2, MidpointRounding.ToEven) == 34.46

Math.Round(34.425, 2, MidpointRounding.ToEven) == 34.42

这就是它的工作原理,这就是我在盒子上得到的东西。舍入到偶数就意味着,向上或向下舍入到达小数点的下一个偶数。

答案 3 :(得分:1)

  

代码Math.Round(34.425,2,MidpointRounding.ToEven)应该等于34.43但是,它等于34.42。

为什么呢? ToEven必须使它成为34.42,因为42是偶数。行为是正确的。

答案 4 :(得分:0)

我不使用vb​​.net,所以我的推理可能不正确,但根据您的参数MidpointRounding.ToEven的名称,我希望34.425四舍五入为34.42;但我也预计34.225将四舍五入至34.22和34.465至34.46。如示例所示,以5结尾的数字舍入是一个常规问题。最常见的约定是舍入到偶数,我推断你的.ToEven参数将被采用。

此外,我怀疑您遇到二进制/十进制舍入问题。检查34.425的二进制表示形式为10010.011011 .......当您考虑计算机存储并表示十进制数(字节,字,双字,四字和负/正补)时,这可能会导致在你没有四舍五入你认为你的数字。

要获得您想要的结果,您应该在舍入之前将任意数字加到0.00001到任意数字。

相关问题