.net – 需要帮助,舍入到2位小数

为什么当我做以下事情?
Math.Round(0.75,1,MidpointRounding.AwayFromZero)

我得到0.8

但是当我执行以下操作

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

我没有得到0.58。相反,我得到0.57。我想要任何5和四舍五入,所以0.575应该是0.58。

问题是,您不能将0.575正好代表二进制浮点数(例如双精度)。虽然我不太清楚,似乎最接近的表示可能只是稍低一点,所以当舍入它使用真实的表示和舍入。

如果要避免此问题,请使用更合适的数据类型。小数将会做你想要的:

Math.Round(0.575M,MidpointRounding.AwayFromZero)

结果:0.58

因为它是简单的1/2 1/4(即2 ^ -1 2 ^ -2),所以0.75的正确的事情是容易在二进制浮点表示。一般来说,两个幂的有限和可以用二进制浮点来表示。例外情况是当你的力量超过2范围(例如2 ^ 100 2不完全可表示)时。

编辑添加

Formatting doubles for output in C#可能在理解为什么它很难理解0.575不是真的0.575的兴趣。 DoubleConverter在接受的答案将显示0.575作为一个精确的字符串是0.5749999999999999555910790149937383830547332763671875你可以看出,为什么舍入给0.57。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...