重複している可能性があります:
C++のfloatの場合はround()
私は、55であることを意味していましたが、実際には54.99999999999994343157として格納されている倍精度浮動小数点数(xと呼ぶ)を持っています。
だから私がするとき
double x = 54.999999999999943157;
int y = (int) x;
55ではなくy = 54です。
これは私を長い間困惑させた。正しく丸めるにはどうすればよいですか?
キャストの前に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を参照してください。 。
キャスティングは数学的な操作ではなく、そのように動作しません。やってみる
int y = (int)round(x);
int
にキャストすると、値が切り捨てられます。 0.5
を追加すると、適切な丸めが行われます。
int y = (int)(x + 0.5);
あなたがしていることが丸めていないこと、それはキャスティングであることは注目に値します。 (int) x
を使用してキャストすると、x
の10進値が切り捨てられます。あなたの例のように、x = 3.9995
の場合、.9995
は切り捨てられ、x = 3
です。
他の多くの人が提案しているように、1つの解決策は0.5
をx
に追加してからキャストすることです。