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
。
正如许多其他人所提出的,一种解决方法是将x
加0.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; }