我有一个名为x的double变量,应该是55,但实际上存储为54.999999999999943157,这是我刚刚意识到的。
所以当我执行以下操作时:
double x = 54.999999999999943157;
int y = (int) x;
y = 54而不是55!
这让我困惑了很长时间。我该如何使它正确地四舍五入?
我有一个名为x的double变量,应该是55,但实际上存储为54.999999999999943157,这是我刚刚意识到的。
所以当我执行以下操作时:
double x = 54.999999999999943157;
int y = (int) x;
y = 54而不是55!
这让我困惑了很长时间。我该如何使它正确地四舍五入?
如果 x > 0,则在转换之前添加 0.5(如果 x < 0,则减去 0.5),因为编译器总是截断。
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,它很可能在底层使用类似的逻辑将0.5添加到| x |中(如果感兴趣,请查看链接),但显然更加健壮。
接下来可能会有一个问题,即为什么浮点数不能精确地存储为55。有关说明,请参见此 stackoverflow 答案。
类型转换不是一种数学运算,它的行为方式也不像数学运算那样。尝试使用
int y = (int)round(x);
int
。 - Keith Thompsonn = (int)round(x);
看起来可以,但如果 n
的类型是 long
呢? - Keith Thompsondouble round (double x);
存在。因此,强制转换确实是必要的。链接:http://www.cplusplus.com/reference/cmath/round/ - Qiangzini将值转换为 int
会截断其小数部分。添加 0.5
可以进行四舍五入。
int y = (int)(x + 0.5);
(int) x
进行强制类型转换会截取 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;
}
#define ROUND_2_INT(f)((int)(f >= 0.0?(f + 0.5):(f-0.5)))
。 - c00000fd