我想用 C++ 从一个大 double 中减去一个小 double 。这是我的代码
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
然而,这三个应该是不同的。为什么 double 类型的减法会这样?
最佳答案
166666166667000000 和 10 都可以用 double 表示。减法的实数运算结果,166666166666999990,不是。严格小于 166666166667000000 的最大双数是 166666166666999968。
166666166666999990 比 166666166666999968 更接近 166666166667000000,因此 166666166667000000 是减法的舍入到最近的 double 结果。
如果你只是做一个小数减法,你可以忽略这个问题。如果您做的小数减法足够多以至于它们的累积效应很重要,则您需要重新安排您的计算。
关于c++ - C++ 中 Double 类型值的减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26977418/