我在将十进制数转换为双精度浮点数时遇到了奇怪的问题。
以下代码返回 true:
Math.Round(0.010000000312312m, 2) == 0.01m //true
然而,当我将其转换为双精度浮点数时,它返回false:
(double)Math.Round(0.010000000312312m, 2) == (double)0.01m //false
当我想使用Math.Pow时,我遇到了这个问题,因为没有针对decimal的Math.Pow重载,所以被迫将其强制转换为double。
这是已知的行为吗?当我被迫将decimal强制转换为double时,我该如何避免这种情况?
来自Visual Studio的屏幕截图:
将Math.Round强制转换为double后,我得到了以下结果:
(double)Math.Round(0.010000000312312m, 2) 0.0099999997764825821 double
(double)0.01m 0.01 double
更新
好的,我按照以下步骤复现了该问题:
- 当我运行WPF应用程序并在启动后立即检查输出时,我会得到与空项目相同的true值。
- 应用程序的一部分将滑动条的值发送到计算算法中。我得到错误的结果,并在计算方法上设置断点。现在,当我在观察窗口中检查值时,我得到false值(没有进行任何修改,只是刷新观察窗口)。
- 只要我在某个较小的项目中复现了该问题,我就会在此处发布它。
更新2
不幸的是,我无法在较小的项目中复现该问题。我认为Eric的答案解释了原因。
true
。 - Rotemfalse
而其他人得到true
? - Rotem