双精度?

时间:2013-02-24 03:45:53

标签: c# for-loop double precision

我有一种情况,我正在向一个方法发送一个数字,它将该数字分成6并返回一个数字6除以n个项目的List。我正在从dictionary.count中提取分割数,并将返回的列表与我从中提取的字典组合起来。返回列表,由于某种原因,它并不总是返回正确数量的项目。它在12阶段工作正常。但是如果不可靠的话,它是可预测的。以下数字返回一个列表,其索引少于所需数量... 13,15,18,23,25,20,27,28,30 .....下面的代码是从一个更大的项目中提取的。

public void DivTest()
{
    double value;
    Double.TryParse(textBox1.Text, out value);

    double div = 6 / value;
    int count = 1;

    StringBuilder sb = new StringBuilder();

    for (double d = div; d <= 6; d += div)
    {
        sb.Append(count.ToString()).Append("  :  ")
            .Append(d.ToString("0.0000")).Append("  :  ")                                                                                                                             
            .Append(div.ToString("0.0000")).AppendLine();

        count++;
    }

    label1.Text = sb.ToString();
}

如果您将此代码添加到具有默认命名文本框,标签和按钮的表单,则它可能无法正常使用。最后一行应该总是6,但它与我提到的数字一致。我认为这是一个四舍五入的问题,但我不是在这个例子中使用舍入。有任何想法吗?感谢。

1 个答案:

答案 0 :(得分:3)

这是一个舍入问题,或者说是数字精度有限的问题。

进行分割时会进行舍入。结果无法准确表示,它受到精度的限制。

当结果向上舍入时,添加它们时最终会有一个稍大的数字,例如6.000000000000001而不是6.当它大于6时,它将不会进入循环中的最后一次迭代

你可以通过对循环使用整数变量来解决这个问题,只需从1循环到value