C++:如何将double四舍五入为int

C++: How to round a double to an int?

本文关键字:四舍五入 int double C++      更新时间:2023-10-16

我有一个双精度(称为x),本应为55,但实际上存储为54.99999999943157,我刚刚意识到这一点。

所以当我做时

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<0); // x is now 55.499999...
int y = (int)x; // truncated to 55

C++11还引入了std::round,它可能使用类似的逻辑,在引擎盖下向|x|添加0.5(如果感兴趣,请参阅链接),但显然更健壮。

后续问题可能是为什么浮点值没有精确存储为55。有关解释,请参阅此stackoverflow答案。

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

int y = (int)round(x);

强制转换为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;
}