gpt4 book ai didi

c# - 意外的十进制值行为

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:42 26 4
gpt4 key购买 nike

我曾经认为我理解 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 它似乎工作正常!

最佳答案

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

也许你可以这样做:

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

关于c# - 意外的十进制值行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com