web-dev-qa-db-fra.com

C: convertir double en flottant, en préservant la précision du point décimal

je voulais convertir double pour flotter en C, mais je voulais conserver le séparateur décimal aussi exactement que possible sans aucun changement ...

par exemple, disons que j'ai

   double d = 0.1108;
   double dd = 639728.170000;
   double ddd = 345.2345678

corrigez-moi maintenant si je me trompe, je sais que la précision en virgule flottante est d'environ 5 chiffres après le point. puis-je obtenir ces cinq chiffres après le point exactement comme le double l'avait? de sorte que ci-dessus résulte comme suit:

   float f = x(d);
   float ff = x(dd);
   float fff = x(ddd);

   printf("%f\n%f\n%f\n", f, ff, fff);

il devrait imprimer

   0.1108
   639728.17000
   345.23456

tous les chiffres après la limite de précision (que je suppose comme 5) seraient tronqués.

18
sdfg

float et double ne stockent pas de décimales. Ils stockent binaire places: float est (en supposant IEEE 754) 24 bits significatifs (7,22 chiffres décimaux) et double est 53 bits significatifs (15,95 chiffres significatifs).

La conversion de double en float vous donnera le float le plus proche possible, donc l'arrondi ne vous aidera pas. Aller dans l'autre sens peut vous donner des chiffres de "bruit" dans la représentation décimale.

#include <stdio.h>

int main(void) {
    double orig = 12345.67;
    float f = (float) orig;
    printf("%.17g\n", f); // prints 12345.669921875
    return 0;
}

Pour obtenir une approximation double de la valeur décimale de Nice que vous vouliez, vous pouvez écrire quelque chose comme:

double round_to_decimal(float f) {
    char buf[42];
    sprintf(buf, "%.7g", f); // round to 7 decimal digits
    return atof(buf);
}
28
dan04

Un float a généralement environ 7 chiffres de précision, quelle que soit la position du point décimal. Donc, si vous voulez 5 chiffres de précision après la décimale, vous devrez limiter la plage des nombres à moins de quelque part autour de +/- 100.

11
Michael Burr