10

2dp に丸めるために次のコードを使用しています。

sprintf(temp,"%.2f",coef[i]); //coef[i] returns a double

6.666 から 6.67 への丸めは正常に行われますが、5.555 の丸めでは正しく機能しません。5.55 を返しますが、(少なくとも私の意見では) 5.56 を返す必要があります。

次の桁が 5 のときに切り上げるにはどうすればよいですか? つまり、5.56 を返します。

編集:cinで5.555を入力すると、5.554999997として保存されるため、これが起こっていることに気付きました。

最初に 3 dp に、次に 2 dp に、2 段階で丸めます。他の(よりエレガントな)アイデアはありますか?

4

5 に答える 5

13

正しい丸めには、数学の丸め関数を使用する必要があるようです。

printf("%.2f %.2f\n", 5.555, round(5.555 * 100.)/100.);

これにより、私のマシンで次の出力が得られます。

5.55 5.56
于 2009-06-15T06:52:53.080 に答える
11

この数値5.555は、IEEE754 では正確な数値として表すことができません。定数5.555を出力すると、次のようになり"%.50f"ます。

5.55499999999999971578290569595992565155029300000000

なので切り捨てになります。代わりにこれを使用してみてください:

printf ("%.2f\n",x+0.0005);

ただし、この式によって誤って切り上げられるため、正確に表現できる数値には注意する必要があります。

浮動小数点表現の制限を理解する必要があります。精度が重要な場合は、IEEE754 表現の欠点を持たない BCD またはその他の 10 進数クラスを使用 (またはコーディング) できます。

于 2009-06-15T06:56:00.127 に答える
2

別の可能な解決策についてはどうですか:

printf("%.2f", _nextafter(n, n*2));

アイデアは、浮動小数点演算で表現できる最小の量だけゼロから数を増やすことです (n*2 は正しい符号を取得します)。

例えば:

double n=5.555;
printf("%.2f\n", n);
printf("%.2f\n", _nextafter(n, n*2));
printf("%.20f\n", n);
printf("%.20f\n", _nextafter(n, n*2));

MSVC 利回りの場合:

5.55
5.56
5.55499999999999970000
5.55500000000000060000
于 2009-06-24T04:03:49.357 に答える
1

この質問には C++ のタグが付けられているため、その前提で進めます。C の printf ファミリとは異なり、C++ ストリームは丸められることに注意してください。必要な精度を指定するだけで、ストリーム ライブラリが丸めます。ストリームを使用しない理由がまだない場合に備えて、私はそれをそこに捨てています。

于 2009-06-15T13:34:27.717 に答える
-2

これを行うこともできます(乗算/除算を保存します):

printf("%.2f\n", coef[i] + 0.00049999);
于 2009-06-15T06:59:07.043 に答える