我有一个 double (称为 x) ,本来是55,但实际上存储为54.99999999999943157,我刚刚意识到这一点。
所以当我这么做的时候
double x = 54.999999999999943157; int y = (int) x;
Y = 54而不是55!
这个问题困扰了我很长时间,我怎样才能使它正确地旋转呢?
铸造不是一个数学运算,也不是这样的。试试看
int y = (int)round(x);
在强制转换之前加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还引入了 圆的,它可能使用了类似的逻辑,将0.5添加到 | x | 底层(如果感兴趣,请参阅链接) ,但显然更加健壮。
一个后续的问题可能是 为什么浮动并没有被精确地存储为55。有关说明,请参见 这个堆栈溢出答案。
转换为 int将截断该值。添加 0.5将使其进行适当的舍入。
int
0.5
int y = (int)(x + 0.5);
值得注意的是,你所做的不是舍入,而是选角。使用 (int) x进行强制转换将截断 x的小数值。在您的示例中,如果 x = 3.9995,则 .9995将被截断,而 x = 3。
(int) x
x
x = 3.9995
.9995
x = 3
正如许多其他人提出的,一种解决方案是将 0.5添加到 x,然后进行强制转换。
#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; }