1

我有一种情况,我将一个数字发送给一个方法,它将该数字分成 6 并返回一个列表,其中数字 6 除以 n 个项目。我正在从 dictionary.count 中提取除数,并将返回列表与我从中提取的字典结合起来。返回列表,由于某种原因,它并不总是返回正确数量的项目。它在 12 岁之前运行良好。但是如果不可靠的话,它是可以预测的。以下数字返回一个比所需索引少 1 个索引的列表...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,但它是我提到的数字。我认为这是一个舍入问题,但在此示例中我没有使用舍入。有任何想法吗?谢谢。

4

1 回答 1

3

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

进行除法时会发生舍入。结果无法准确表示,受精度限制。

将结果四舍五入后,将它们相加时会得到一个稍大的数字,例如 6.000000000000001 而不是 6。由于它大于 6,因此不会进入循环中的最后一次迭代。

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

于 2013-02-24T03:57:23.850 回答