2012-02-29 6 views
2

私は浮動小数点を使ったことは一度もありませんでしたが、現在作業中のプロジェクトではそれが必要です。私は数年前に学んだ奇妙な問題を抱えていますが、なぜこれが起こるのか忘れてしまっています。なぜ私の浮動小数点値は精度とドロップ小数点を失うのですか?以下のコード例

浮動小数点数を掛けたり追加したりした後の結果は、その結果とは異なります。

はここに私のコードです:短い、実数で

void main() 
{ 
    //Example 1 - ERROR 
    float a=16937.6; 
    float b=112918; 
    float total=b+a; 
    cout<<total<<endl; //Outputs 129896 - rounds up and loses decimal (129855.6) 

    //Example 2 - Error 
    float c=247.82; 
    float d=9995.2; 
    float total2=c+d; 
    cout<<total2<<endl; //Outputs 10243 - loses all decimals (10243.02) 
    system ("pause"); 

} 
+1

http://en.wikipedia.org/wiki/Floating_point精度の問題上のセクションは、あなたが探しているものです。 – Almo

+1

いいえ、私はこのケースで間違って出力されていると思います。 – user1147223

答えて

7

問題は小数精度ではなく、値を出力するために使用される形式です。

試してみてください。

cout << setiosflags(ios::fixed) << setprecision(2) << x; 
+2

+1:はい、この場合、これは正解です。 –

+0

これは美しく動作します!私は数値の他の形式を使用しようとしていたが、同じ結果(ダブルスなど)を持っていた。それを理解できませんでした。 ありがとうございます! – CREW

+0

いいえ、6桁を超える数字を扱っている場合は、 'float'は正しい答えではありませんが、出力関数を強制します。 – Amadan

4
+4

真剣に、同じ精度の質問がノンストップです。答えは常に同じです。それはよくある質問です。 – Anycorn

+3

これは小数精度ではなく、出力書式設定に関するものだと思います。 –

+0

@DStanley:私はそれがつながっていると思います。出力丸めが存在するので、 '0.1 + 0.2 = 0.30000000000000004'のようなものは得られません。最初の例では、32ビット算術演算の結果は '129855.6015625'になり、出力関数は6桁だけが確実であることを知っているので、結果を丸めます。出力精度を設定することで、より多くの数字を得ることができますが、正しいかどうかはわかりません。 – Amadan

関連する問題