.Net舍入问题

Jef*_*eff 12 .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
Run Code Online (Sandbox Code Playgroud)

我只是想检查以前是否有人遇到过这个问题?

现在我已经通过将数字转换为小数来解决了这个问题.我已将代码更改为此,现在工作正常:

Math.Round(CDec(34.425), 2, MidpointRounding.AwayFromZero) = 34.43
Run Code Online (Sandbox Code Playgroud)

我只是在寻找原因,为什么我的旧代码不起作用.

谢谢!

将代码更新为正确的AwayFromZero

cod*_*nix 20

浮点从来都不是确切的,可以34.425具有内部represantation 34.4249999999999 ..这将四舍五入至34.42.

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

  • @Jeff:这是因为浮点表示.请查看http://docs.sun.com/source/806-3568/ncg_goldberg.html获取浮点数学的入门知识.基本上,浮点数存储在科学记数法中,具有二进制基数/尾数和2指数的整数幂.并非所有数字都能以这种方式准确表示.十进制虽然在大多数现实世界算术中像浮点一样工作,但使用稍微不同的存储机制,这限制了可存储值的范围,但在该范围内大大提高了精度和准确度 (2认同)