C: convert double to float, preserving decimal point precision
Solution 1
float
and double
don't store decimal places. They store binary places: float
is (assuming IEEE 754) 24 significant bits (7.22 decimal digits) and double is 53 significant bits (15.95 significant digits).
Converting from double
to float
will give you the closest possible float
, so rounding won't help you. Goining the other way may give you "noise" digits in the decimal representation.
#include <stdio.h>
int main(void) {
double orig = 12345.67;
float f = (float) orig;
printf("%.17g\n", f); // prints 12345.669921875
return 0;
}
To get a double
approximation to the nice decimal value you intended, you can write something like:
double round_to_decimal(float f) {
char buf[42];
sprintf(buf, "%.7g", f); // round to 7 decimal digits
return atof(buf);
}
Solution 2
A float
generally has about 7 digits of precision, regardless of the position of the decimal point. So if you want 5 digits of precision after the decimal, you'll need to limit the range of the numbers to less than somewhere around +/-100.
sdfg
Updated on February 22, 2020Comments
-
sdfg about 4 years
i wanted to convert double to float in C, but wanted to preserve the decimal point exactly as possible without any changes...
for example, let's say i have
double d = 0.1108; double dd = 639728.170000; double ddd = 345.2345678
now correct me if i am wrong, i know that floating point precision is about 5 numbers after the dot. can i get those five numbers after the dot exactly as the double had it? so that above results as follows:
float f = x(d); float ff = x(dd); float fff = x(ddd); printf("%f\n%f\n%f\n", f, ff, fff);
it should print
0.1108 639728.17000 345.23456
all digits after the precision limit (which i assume as 5) would be truncated.
-
dan04 over 6 years@davidvandebunte: That's only in C++. The question is tagged as C.
-
csl almost 6 yearsGoing through a string in
round_to_decimal
seems like a horrible idea. Surely there must be a much better way to do it with some math.