C ++:如何将一个double到一个int?

可能重复:
round()用于C ++中的float

我有一个double(称为x),意思是55,但实际上存储为54.999999999999943157,我刚刚意识到。

所以当我这样做

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

y = 54而不是55!

这让我困惑了很久。 我如何才能正确回合?

在铸造前添加0.5(如果x> 0)或者减去0.5(如果x <0),因为编译器将总是截断。

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

C ++ 11还引入了std :: round ,它可能使用类似的逻辑,将| 0.5 |加到0.5 (如果感兴趣,请参阅链接),但显然更强大。

一个后续问题可能是为什么浮动存储不完全是55.有关说明,请参阅此 stackoverflow答案。

铸造不是math运算,也不是如此。 尝试

 int y = (int)round(x); 

投射到一个int截断值。 加0.5会使它做适当的舍入。

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

值得注意的是,你所做的并不是四舍五入,而是铸造。 使用(int) x铸造将截断(int) x的十进制值。 在你的例子中,如果x = 3.9995 ,则.9995被截断, x = 3

正如许多其他人所提出的,一种解决方法是将x0.5 ,然后投。

 #include <iostream> #include <cmath> using namespace std; int main() { double x=54.999999999999943157; int y=ceil(x);//The ceil() function returns the smallest integer no less than x return 0; }