comp.lang.c FAQ list
·
Question 14.1

Q:
When I set a float variable to, say, 3.1,
why is printf printing it as 3.0999999?

A:
Most computers use base 2
for floating-point numbers
as well as for integers,
and
just
as for base 10,
not all fractions are representable exactly in base 2.
It's well-known that
in base 10,
a fraction like
1/3 = 0.333333...
repeats
infinitely.
It turns out that
in
base 2,
one tenth
is
also
an infinitely-repeating fraction
(0.0001100110011...),
so
exact decimal fractions
such as 3.1
cannot be represented exactly in binary.
Depending on how carefully
your compiler's binary/decimal conversion routines
(such as those used by printf)
have been written,
you may see discrepancies when
numbers
not exactly representable in base 2
are assigned or read in and then printed
(i.e. converted from base 10 to base 2 and back again).
[footnote]
See also question 14.6.