7

こんにちは、私はC#でこのコードを持っています:

float n = 2.99499989f;
MessageBox.Show("n = " + n.ToString("f2", CultureInfo.InvariantCulture));

そして、C++ のこのコード:

float n = 2.99499989f;
printf("n = %.2f", n);

最初のものは3.00を出力します。
2 番目の出力は 2.99です。

なぜこれが起こっているのかわかりません。

アップデート:

Objective-C NSLogも試しましたが、出力は2.99です。

すぐに修正する必要があったため、次の方法を使用しました。

float n = 2.99499989f;
float round = (float)Math.Round(n, 2);
MessageBox.Show("round = " + round.ToString(CultureInfo.InvariantCulture));

このコードは2.99を示していますが、倍精度で丸めを計算します。Math.RoundF が見つかりません。

4

6 に答える 6

7

BitConverter.GetBytes生成された実際のバイト数を使用して出力すると、これはコンパイラの違いではないことがわかります。どちらの場合も、格納されている実際の float 値はであり、この便利な計算機が教えてくれる正確な値です0x403FAE14

2.99499988555908203125

したがって、違いはprintfとの動作の違いにあるはずToStringです。それ以上は、すぐには言えません。

于 2010-01-18T12:08:42.740 に答える
0

最初のものは、数値を誤って丸めます。

2番目のものは、コンマの後の2桁のみを選択すると思います。

たぶん、浮動小数点精度の問題ですか?2.9949... 実際には 2.995 以上に丸められますか?

于 2010-01-18T11:14:21.927 に答える
0

それは、「float」が「それ」ではないという事実によるものではありませんか?

小数を使用する場合は、これを確認してください。

        // float
        Console.WriteLine (2.99499989f.ToString ("f2"));
        // The above line outputs 3.00

        // decimal
        Console.WriteLine (2.99499989M.ToString ("f2"));
        // The above line outputs 2.99

おそらく、float は 2.99499989 などを 2.99 として表すことはできません。
これを行うとどうなるかも見てください:

// float
Console.WriteLine (2.98499f.ToString ("f2"));
// The above line outputs 2.99
于 2010-01-18T11:14:26.233 に答える
0

float の精度は2^{-23}、またはその程度です0,0000001192(相対誤差)。ほら、2.995-2.99499989 = 0,00000011。相対誤差は3,6*10^{-8}.

一部のコンパイラが2.99499989f定数のすべての桁を読み取ると、結果は 2.995 より大きい数値になります。しかし、別のコンパイラが読み取り専用の場合2.994999(精度が 2^{-23} 未満で、最後の桁が重要ではないため)、結果は 2.995 未満の数値になります。

于 2010-01-18T12:05:44.400 に答える
-1

2.99499989f という数値は、IEEE754 では正確に表すことができません。どうやら printf と ToString は、この状況を異なる方法で処理します。

于 2010-01-18T11:48:34.303 に答える