25

現在、次をdouble使用して a を出力ストリームに丸めることができます。

output.setf(std::ios::fixed,std::ios::floatfield);
output.precision(3);

しかし、与えられたdoubleので、ベクトルに挿入する前に変換する必要があります。たとえば、数値-0.00078が表示された場合、それは等しい0.000ので、保存する必要はありません。一方、1.0009は次のようになります1.001(精度関数が処理するのと同じ)。

C ++でそのようなdoubleを変換するにはどうすればよいですか?

4

4 に答える 4

40

一般的なトリックは、数学でそれを行うことです:

value = round( value * 1000.0 ) / 1000.0;

round負の値と正の値を正しく処理する場所...次のようなもの(テストされていません):

inline double round( double val )
{
    if( val < 0 ) return ceil(val - 0.5);
    return floor(val + 0.5);
}

浮動小数点の精度の問題により、出力時に小数点以下の桁数を 3 に設定する必要があります。

于 2013-01-16T23:25:14.840 に答える
9

ここでの他の回答はあなたにテクニックを与えました。ただし、すべての値を浮動小数点で正確に表現できるわけではないことに注意してください。1.001 が良い例です。最も近い可能な値は 1.00099999999999988987 です。

したがって、厳密に小数点以下 3 桁を取得することが目的である場合、答えは次のとおりです。それは不可能です。

于 2013-01-16T23:29:07.873 に答える
5

これを 1000 倍して丸め (または切り捨て) ます。これにより、小数点以下 3 桁の値の 1000 倍の値が得られます。1000 で割って「丸めた」値を取得すると、小数点以下 3 桁を超える可能性があることに注意してください (丸め誤差のため)。

于 2013-01-16T23:25:02.890 に答える