Estoy intentando escanear un archivo csv. Aquí está el código.

    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]);

Supongamos que abc.csv contiene

11.654,22.332
11.654,22.332
11.654,22.332

Cuando imprimo, obtengo una salida como,

11.654000, 22.332001
11.654000, 22.332001
11.654000, 22.332001

¿De dónde viene el .000001 extra?

Cualquier ayuda es apreciada. Gracias de antemano.

c
1
lu5er 15 dic. 2016 a las 09:28

2 respuestas

La mejor respuesta

Nada que ver con el scanf. Es por la forma en que float se representa / almacena en la memoria.

Pruebe lo siguiente:

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

Verás que el resultado es el mismo.

Mire: https://softwareengineering.stackexchange.com/questions/101163/what -causa-errores-de-redondeo-de-coma-flotante

5
Community 13 abr. 2017 a las 12:45

Los números de coma flotante se almacenan en la memoria con estándares como IEEE-754 (simple o doble), estos estándares no podrían representar todos los números de coma flotante que espera porque son de coma flotante. la precisión del almacenamiento de punto flotante no es constante, por lo que intentan redondear los números al número más cercano posible que pueden almacenar.

Además, la precisión predeterminada de% f en printf es 6, puede establecerla en 3

printf("%.3f, %.3f\n",pts[i][0],pts[i][1]);
1
e.jahandar 15 dic. 2016 a las 06:38