2

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

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

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它似乎可以正常工作!

4

2 回答 2

2

你没有错过任何东西。这是在内部多次舍入数字的结果,即复合精度损失。首先,增量并不完全是10.640333333333333333333333333,但 3 不断重复,导致使用此小数进行乘法或除法时精度损失。

也许你可以这样做:

for (decimal i = maximum; i >= delta; i -= delta)
{
   Interval interval = new Interval(i - delta, i);
}
于 2013-05-03T09:10:13.387 回答
0

Double 具有 16 位精度,而 Decimal 具有 29 位精度。因此,双精度数比十进制数更可能四舍五入。

于 2013-05-03T09:18:28.850 回答