从 C++ 中的函数返回双精度问题

Problem returning double from a function in C++

我有这样的功能:

double foo(int a, int b)
{
    double r=a+b;
    return r/2.0;
}

当 a= 10000 和 b= 10001 时它工作正常。 Returns10000.5

但是当 a= 100000 b= 100001 它 returns 100000

我也用其他号码测试过。它仅在整数小于 6 位时有效。(输出时不使用 setprecision)

我也试过这个,但没有用。

double r= double(a+b);

谁能解释一下这是怎么回事?如果我在输出中使用 setprecision,就没有问题。

但是,我无法控制何时以及如何打印输出,我只能提交此功能。有什么我可以做的吗?

C double 或 long double 默认使用 6 位精度输出。如果你想写 2000.007,它会给出输出 2000.01,四舍五入到 6 位。但在内存中它将具有正确的值。所以,正确的做法是

double foo(int a, int b)
{
    double r=a+b;
    cout<<setprecision(4)<<fixed;
    return r/2.0;
}

并且当您使用 setprecision()fixed 时,输出将从该点向前到所有输出格式化,直到进一步进行更改。 所以,如果您不想更改输出样式的任何内容,恐怕您对此无能为力。

编辑:有时使用双打似乎会导致意外输出。例如,如果你有类似

double c = 299792458;
double b = 299792450;
cout<<c<<" "<<b<<" "<<c-b;

它会输出

2.99792e+008 2.99792e+008 8

再次四舍五入为 6 位数字,这正是它应该如何发生的。但是作为第三个输出,结果是正确的。