sscanf有什么问题?

时间:2016-12-15 06:28:56

标签: 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]);

假设abc.csv包含

11.654,22.332
11.654,22.332
11.654,22.332

当我打印时,我得到输出,

11.654000, 22.332001
11.654000, 22.332001
11.654000, 22.332001

额外的.000001来自哪里?

感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:5)

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

尝试以下方法:

float x = 22.332;
printf("%f\n", x);

你会看到结果是一样的。

请注意:https://softwareengineering.stackexchange.com/questions/101163/what-causes-floating-point-rounding-errors

答案 1 :(得分:1)

浮点数用IEEE-754(单或双)等标准存储在内存中,这些标准不能代表您期望的每个浮点数,因为它们是浮点数。浮点存储的准确性不是恒定的,所以他们试图将数字四舍五入到可以存储的最接近的数字。

printf中%f的默认精度为6,您可以将其设置为3

printf("%.3f, %.3f\n",pts[i][0],pts[i][1]);