Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C+;中的函数返回double时出现问题+;_C++_Double_Precision - Fatal编程技术网

C++ 从C+;中的函数返回double时出现问题+;

C++ 从C+;中的函数返回double时出现问题+;,c++,double,precision,C++,Double,Precision,我有一个类似于: double foo(int a, int b) { double r=a+b; return r/2.0; } 当a=10000和b=10001时,工作正常。返回10000.5 但当a=100000 b=100001时,它返回100000 我也用其他数字进行了测试。它仅在整数小于6位时有效。(输出时不使用setprecision) 我也试过了,但没用 double r= double(a+b); 有人能解释发生了什么事吗?如果我在输出端使用setpreci

我有一个类似于:

double foo(int a, int b)
{
    double r=a+b;
    return r/2.0;
}
当a=10000和b=10001时,工作正常。返回10000.5

但当a=100000 b=100001时,它返回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;
}

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

你能告诉我你是怎么测试这个的吗?如果它只是基于输出值,那么函数就没有问题,关键在于它在输出中的显示方式。您的函数工作正常,您不必关心值的显示方式。如果使用setprecision会导致打印额外的数字,则这意味着正确的值在整个时间内都存储在双精度中。更改输出格式不会更改值,只会更改值转换为文本的方式。不,您无能为力。您无法控制输出的打印方式,但您要求输出的打印精度超过六位数。显然,这是在要求不可能的事情。您的代码当然没有问题。@Peter我这样做了:double a2=a;双r=a2+b;但它不起作用。@SamiKuhmonen我只是用coutThis将一个值打印到控制台,这不是OP想要的。OP只想返回不需要setprecision的值。引用:“我无法控制何时以及如何打印输出,我只能提交此函数。”我认为更好的方法是使用
cout.precision(8)
,或任何大于默认值
6
的数字来获得OP想要的结果。@TrevorGalivan您似乎不理解答案。这意味着结果已经是正确的。在这种情况下,根本不需要额外的行。@TrevorGalivan Afaik,它不向控制台打印任何内容。这只是声明流操纵器的一种方法。我可能是wrong@TamimEhsan哇!你是对的,我看错了。如果此函数的目的只是执行一些计算,那么每次调用此函数时修改输出流的精度仍然没有意义。
double c = 299792458;
double b = 299792450;
cout<<c<<" "<<b<<" "<<c-b;
2.99792e+008 2.99792e+008 8