意外的十进制值行为

时间:2013-05-03 08:59:35

标签: c# .net

我曾经认为我理解decimaldouble值之间的区别,但现在我无法证明此代码段的行为是正确的。

我需要在某些间隔中划分两个十进制数之间的差异,例如:

decimal minimum = 0.158;
decimal maximum = 64.0;
decimal delta = (maximum - minimum) / 6; // 10.640333333333333333333333333

然后我以相反的顺序创建间隔,但第一个结果已经是意外的:

for (int i = 5; i >= 0; i--)
{
   Interval interval = new Interval(minimum + (delta * i), minimum + (delta * (i + 1));
}

{53.359666666666666666666666665, 63.999999999999999999999999998}

我希望最大值恰好是64.我在这里缺少什么?

非常感谢!

编辑:如果我使用double代替decimal,它似乎正常运作!

2 个答案:

答案 0 :(得分:2)

你没有遗漏任何东西。这是内部多次舍入数字的结果,即复合精度损失。首先,delta不是10.640333333333333333333333333,但3s会不断重复,当使用此小数乘以或除以时会导致精度损失。

也许你可以这样做:

for (decimal i = maximum; i >= delta; i -= delta)
{
   Interval interval = new Interval(i - delta, i);
}

答案 1 :(得分:0)

Double具有16位精度,而Decimal具有29位精度。因此,double可能会将其四舍五入而不是十进制。