C + + : 如何将一个双精度数舍入为一个整型数?

我有一个 double (称为 x) ,本来是55,但实际上存储为54.99999999999943157,我刚刚意识到这一点。

所以当我这么做的时候

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

Y = 54而不是55!

这个问题困扰了我很长时间,我怎样才能使它正确地旋转呢?

516903 次浏览

铸造不是一个数学运算,也不是这样的。试试看

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 y = (int)(x + 0.5);

值得注意的是,你所做的不是舍入,而是选角。使用 (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;
}