我曾经认为我理解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
,它似乎正常运作!
答案 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可能会将其四舍五入而不是十进制。