I wonder why in JavaScript

0.1 + 0.2  // return 0.30000000000000004

4%0.1 // return 0.09999999999999978

http://jsbin.com/oHISAfU/1/edit (Example)

In C the math.h library fmod function

printf("%f", fmod(4.0,0.1));  // print 0.100000 

http://ideone.com/RG5Wyv (Example)

And in Spotlight (search feature in the Mac OS X ~ I already submit bug report) that support math operation

4%0.1 = 0.1

enter image description here


It's because 0.1 = 1 / 10 = 1 / (2 × 5) cannot be represented exactly in binary floating point. This happens in C too:

 printf("%.20f", fmod(4.0,0.1));

prints 0.09999999999999978351.

Specifically, the only numbers that binary floating point can represent exactly are dyadic fractions of the form a / 2b, where a and b are integers. Even more specifically, for IEEE single precision floating point numbers, a must be between -224 and 224 and b must, in effect, be between -151 and 104. (Or at least approximately so; there are some tricky special cases like denormalized numbers.) For double precision floats, the ranges are wider, but even so, a fraction like 1 / 10 cannot be represented exactly, because the denominator is not a power of two.

| cite | improve this answer | |

Ilmari Karonen gets it right in the other answer. But it gets even worse than that: arithmetic operations involving floating-point numbers don't necessarily behave the same as operators we're used to from mathematics. For instance, we're used to addition being associative, so that $a + (b + c) = (a + b) + c$. This doesn't generally hold using floating-point numbers, and for a given format it's not hard to come up with counterexamples. Not exactly relevant to the question you asked, except to illustrate that you should never assume floating point calculations are going to be exact.

| cite | improve this answer | |
  • 5
    $\begingroup$ In particular, for sufficiently large $a$ and sufficiently small $b > 0$, it's quite possible that $a + b = a$ in floating point. $\endgroup$ – Ilmari Karonen Aug 19 '13 at 18:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.