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

C# 为什么Math.Round()在C中的工作方式不同#,c#,math,rounding,C#,Math,Rounding,首先,我注意到Math.Round()并不像我所说的那样对两位数进行取整: double dd = Math.Round(1.66666, 2); 结果: dd = 1.6699999570846558; 然后,我用相同的.NET framework创建了一个新项目,结果是1.67,它本来应该是这样的 我以前从未见过Round像这样的行为,是什么导致了这个问题?像前面提到的其他注释一样,使用decimal保存返回值: decimal dd = Math.Round(1.66666M, 2);

首先,我注意到
Math.Round()
并不像我所说的那样对两位数进行取整:

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

dd = 1.6699999570846558;
然后,我用相同的.NET framework创建了一个新项目,结果是
1.67
,它本来应该是这样的


我以前从未见过
Round
像这样的行为,是什么导致了这个问题?

像前面提到的其他注释一样,使用
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.66666 m,它是一个十进制值,而不是1.66666,它是一个浮点数。

不要再问这个问题。问题是您正在使用不精确的数字类型来表示精确的值。如果需要精确的十进制值,请使用
decimal
。有那么一分钟,我几乎以为这将是一个古老的“银行家取整”问题?事实上,作为一名编程人员,您避免学习浮点数是如何工作的。这就意味着你对自己的工作缺乏基本的了解,就像一个厨师在打开烤箱的时候会感到烤箱变热一样。。。浮点数。要么接受这一事实并以适当的格式显示数字,要么使用
十进制
类型。或者在@presiuslitelsnoflek的链接上,查看@Weston感谢您的观察。我关注的是解释而不是代码,因为OP显然只是在测试东西,他需要的是解释而不是代码。不过,为了正确起见,我更新了我的答案。我还添加了一个关于
Round()
函数的注释。您的答案正是我想要的,谢谢!