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.
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);
}
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.