在C ++中减去Double类型值

时间:2014-11-17 16:39:06

标签: c++ c double

我试图从C ++中的一个大的双数中减去一个小的双数。这是我的代码

int main() 
{
double a=166666166667000000.000000;
double b=1.0;
double c=4.0;
double d=10.0;

double ans_b=a-b;
double ans_c=a-c;
double ans_d=a-d;

printf("%f\n%f\n%f\n",ans_b,ans_c,ans_d);
return 0;
}

本规范给出了以下输出 -

166666166667000000.000000
166666166667000000.000000
166666166667000000.000000

然而,这三者应该是不同的。为什么双重类型的减法表现得这样?

1 个答案:

答案 0 :(得分:1)

166666166667000000和10都可以在double中完全表示。减法的实数算术结果166666166666999990不是。最大双倍严格小于166666166667000000是166666166666999968。

166666166666999990更接近166666166667000000而不是166666166666999968,因此166666166667000000是减法的舍入到最接近的双倍结果。

如果您只是进行一次小数减法,则可以忽略该问题。如果你做了足够的小数量的减法,他们的累积效果很重要,你需要重新安排你的计算。