【发布时间】:2012-03-14 03:01:18
【问题描述】:
我有一个 double(称为 x),本来是 55,但实际上存储为 54.999999999999943157,这是我刚刚意识到的。
所以当我这样做时
double x = 54.999999999999943157;
int y = (int) x;
y = 54 而不是 55!
这让我困惑了很久。我怎样才能让它正确地四舍五入?
【问题讨论】:
-
您可以将 0.5 添加到数字,然后进行强制转换以使其截断为 int。是否需要舍入负数?
-
你可以使用这个预处理器定义:
#define ROUND_2_INT(f) ((int)(f >= 0.0 ? (f + 0.5) : (f - 0.5))) -
实际上 54.999999999999943157 在 完全可表示 55 以下 8 个 ULP,如果
double你的意思是来自 IEEE 754 的 binary64。所以这不是 55 的实际存储方式,而是你的计算有多不精确。 -
在将负输入转换为 int 之前将 +0.5 添加到负输入会给出错误的答案。正确的快速和肮脏的方法是测试输入符号
标签: c++ floating-point rounding