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 ではなく 6.000000000000001 のように、合計するとわずかに大きな数値になります。これは 6 よりも大きいため、ループの最後の反復には入りません。

これを修正するには、ループに整数変数を使用して、単純に 1 から までループしvalueます。

于 2013-02-24T03:57:23.850 に答える