sscanf有什么问题?

lU5*_*5er 0 c

我正在尝试扫描csv文件.这是代码.

    FILE *fp;
    float pts[1000][2];
    char line[1000];
    int n = 0;
    fp = fopen("abc.csv","r");
    n = 0;
    while(fgets(line, sizeof line, fp))
    {
        sscanf(line,"%f,%f",&pts[n][0],&pts[n][1]);
        n++;
    }
    for(i=0;i<n;i++)
        printf("%f, %f\n",pts[i][0],pts[i][1]);
Run Code Online (Sandbox Code Playgroud)

假设abc.csv包含

11.654,22.332
11.654,22.332
11.654,22.332
Run Code Online (Sandbox Code Playgroud)

当我打印时,我输出为,

11.654000, 22.332001
11.654000, 22.332001
11.654000, 22.332001
Run Code Online (Sandbox Code Playgroud)

额外的.000001来自哪里?

任何帮助表示赞赏.提前致谢.

小智 5

与scanf无关.这是因为float在内存中表示/存储的方式.

请尝试以下方法:

float x = 22.332;
printf("%f\n", x);
Run Code Online (Sandbox Code Playgroud)

你会看到结果是一样的.

请看:https://softwareengineering.stackexchange.com/questions/101163/what-c​​auses-floating-point-rounding-errors

  • 使用像GNU MPFR这样的任意精度`decimal`库.如果不是一个矫枉过正的话. (2认同)