web-dev-qa-db-ja.com

C ++:doubleをintに丸める方法は?

重複している可能性があります:
C++のfloatの場合はround()

私は、55であることを意味していましたが、実際には54.99999999999994343157として格納されている倍精度浮動小数点数(xと呼ぶ)を持っています。

だから私がするとき

double x = 54.999999999999943157;
int y = (int) x;

55ではなくy = 54です。

これは私を長い間困惑させた。正しく丸めるにはどうすればよいですか?

83
midnightBlue

キャストの前に0.5を加算する(x> 0の場合)か、0.5を減算する(x <0の場合)。コンパイラーは常に切り捨てます。

float x = 55; // stored as 54.999999...
x = x + 0.5 - (x<0); // x is now 55.499999...
int y = (int)x; // truncated to 55

C++ 11では std :: round も導入されています。これは、| x |に0.5を加えるという同様のロジックを使用する可能性があります。フードの下(興味があればリンクを参照)ですが、明らかにより堅牢です。

フォローアップの質問は、なぜフロートが正確に55のように格納されていないのかもしれません。説明については、 this stackoverflow answerを参照してください。 。

111
Moritz

キャスティングは数学的な操作ではなく、そのように動作しません。やってみる

int y = (int)round(x);
43
MK.

intにキャストすると、値が切り捨てられます。 0.5を追加すると、適切な丸めが行われます。

int y = (int)(x + 0.5);
7
Pubby

あなたがしていることが丸めていないこと、それはキャスティングであることは注目に値します。 (int) xを使用してキャストすると、xの10進値が切り捨てられます。あなたの例のように、x = 3.9995の場合、.9995は切り捨てられ、x = 3です。

他の多くの人が提案しているように、1つの解決策は0.5xに追加してからキャストすることです。

4
user1253795