3

正の double を最も近い整数に切り上げる関数が必要でした。aorund に潜む私はこの非常にエレガントな方法を見つけました

int x = floor(y + 0.5);

簡単なテストプログラムを書きました:

double a = 10.0;

for (int i = 0; i < 10; i++) {
  cout << a << "\t" << a + 0.5 << "\t" << floor(a + 0.5) << endl;
  a += 0.1;
}

しかし、私は奇妙な出力を受け取ります

10      10.5    10
10.1    10.6    10
10.2    10.7    10
10.3    10.8    10
10.4    10.9    10
10.5    11      10 <--- should be 11!
10.6    11.1    11
10.7    11.2    11
10.8    11.3    11
10.9    11.4    11

それはなぜですか?

よろしくルカ

4

4 に答える 4

0

問題は、他の人が指摘したように、実際には持っていないこと10.5です。非常に近いものしかありません10.5(ただし、非常にわずかに小さい)。

原則として、この種の場合、浮動小数点値にインクリメントを追加するべきではありません。整数のインクリメントのみを使用し、毎回浮動小数点値にスケーリングする必要があります。

for ( int i = 0; i != 10; ++ i ) {
    double aa = a + ( i / 10. );
    std::cout << aa << '\t' << aa + 0.5 << '\t' << floor( aa + 0.5 ) << std::endl;
}

これにより、望ましい結果が得られるはずです。

もちろん、あなたの例が単なるテストである場合...丸められる値がどのように計算されるかに大きく依存します。使用している実際の丸めが適切な場合があります。または、値が の倍数でなければならないことがわかっている場合は0.1、10 でスケーリングされた算術演算を実行してから、結果を丸め、次に 10 の倍数に丸めることができます。

于 2013-03-13T09:46:29.173 に答える