C++ c++;双精度拟合数字的错误表示

C++ c++;双精度拟合数字的错误表示,c++,floating-point,floating-point-precision,C++,Floating Point,Floating Point Precision,看看这个剪下来的: #include <iostream> #include <cstdio> using namespace std; int main() { //double a = 15670.1; //a += 110420; double a = 1.1; a += 110420; printf("%f\n",a); cout << a << endl; a = 1.1;

看看这个剪下来的:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    //double a = 15670.1;
    //a += 110420;
    double a = 1.1;
    a += 110420;
    printf("%f\n",a);
    cout << a << endl;
    a = 1.1;
    a += 11042;
    printf("%f\n",a);
    cout << a << endl;
}

看起来printf工作正常,但是cout在第一个测试用例中有什么问题?在第二个测试用例中,这是(0.1),为什么(Cout)是正确的?

< P>默认情况下,C++流格式浮点值为6个有效数字,而<代码> Prtff < /C> >,< <代码> %F>代码>,将它们格式化为6个小数点。 您可以使用
std::setprecision
(在
中声明)指定更高的精度:

cout << setprecision(7) << a << endl; // 110421.1
std::streamsize ss = std::cout.precision();
std::cout << "Initial precision = " << ss << '\n';

cout默认情况下cout的精度太低。您可以使用
setprecision()
来增加它。请参见以下示例:

#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;
int main()
{
    //double a = 15670.1;
    //a += 110420;
    double a = 1.1;
    a += 110420;
    printf("%f\n",a);
    cout << setprecision(20) << a << endl;
    a = 1.1;
    a += 11042;
    printf("%f\n",a);
    cout << a << endl;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
//双a=15670.1;
//a+=110420;
双a=1.1;
a+=110420;
printf(“%f\n”,a);

coutdouble的默认精度为6。您可以使用6检查此值。您可以使用precision()检查此值:

现在可以使用setprecision(int)调整精度:


cout你得到不同结果的原因是因为你要求
不同的东西。在
printf
中,您要求的是固定的 格式。使用
std::cout
,您要求的是可变格式, 对应于
printf
中的
%g”
。如果将
std::cout
设置为 固定格式,例如:

std::cout << std::fixed << a;

std::cout@Pooya:在第二种情况下,6个有效数字足够给出期望值。在第一种情况下,您需要7。您能解释一下吗?@Pooya digits count,点不是一个数字digit@Pooya:解释有效数字?这是基础数学:答案并不能解决问题,因为在这两种情况下,精度都设置为6.t不同之处在于不同的输出格式(这只是暗示),以及它们处理精度的方式。这里的有效数字更少。
110421.100000        // oops, truncated to 6 digits, gives 110421 printed

11043.100000         // oops, truncated to 6 **digits**, thus 110431 printed
cout << setprecision(10) << a << endl;
std::cout << std::fixed << a;