为什么Math.Round()在C#中的工作方式不同

时间:2014-03-20 13:24:25

标签: c# math rounding

首先我注意到Math.Round()并没有围绕2位数进行舍入:

double dd = Math.Round(1.66666, 2);

结果:

dd = 1.6699999570846558;

然后我创建了一个具有相同.NET框架的新项目,结果现在是1.67,因为它应该是第一个。

我之前从未见过Round这样的行为,导致这个问题的原因是什么?

1 个答案:

答案 0 :(得分:3)

与上述其他评论一样,使用decimal保存返回的值:

decimal dd = Math.Round(1.66666M, 2);

您描述的问题与Round()功能无关。您可以阅读一些有关浮点数和数字的信息。定点数有效,但简短的解释是:

对于浮点变量(例如double),您无法保证保存它们的数字的精确度。因此,当您在double类型的变量中保存类似1.67的内容然后稍后检查该值时,不能保证您将获得正好1.67。你可能得到一个像1.66999999(类似于你得到的)或类似1.6700000001的值。

另一方面,固定点变量(例如decimal)会给你那么精确,所以如果你保存1.67,你将总是得到1.67。

请注意,Round()函数返回的是您传递给它的相同类型,因此要返回decimal,您需要传递 1.66666M ,这是十进制值而不是1.66666,这是一个浮点数。