Why 0.1 + 0.2 == 0.3 is false in JS? Mystery Unsolved With Solution

Gaurav Singh
2 min readJun 29, 2021

--

JS follows a 32-bit floating point representation for numbers.
Out of 32 bits :
1 is sign bit(number is negative if the value is 1),
8 bits indicate the exponent value(e) and other
23 bits represent the fraction value.

The 32-bit floating-point number system

With the 32 bits, the value is computed by this serious looking formula:

Formulae to calculate decimal value from 32-bit floating point

With decimal fractions, this floating-point number system causes some rounding errors in JavaScript. For example, 0.1 and 0.2 cannot be represented precisely. Hence, 0.1 + 0.2 === 0.3 yields false.

To really understand why 0.1 cannot be represented properly as a 32-bit floating-point number, you must understand binary. Representing many decimals in binary requires an infinite number of digits.This is because binary numbers are represented by 2 power n(2ˆn) where n is an integer. While trying to calculate 0.1, long division will go on forever.

Calculating 0.1 (1/10) results in an indefinite number of decimal points.

Long Division for 0.1

Check the error rate while conversion from decimal to binary numbers in more depth at this link

Now the question is can we solve this problem?
— Yes. We can and We will.

We would use
Number.EPSILON for this.

Number.EPSILON returns the smallest interval between two representable numbers.This is useful for the problem with floating-point approximation.

numberEquals function which handles floating precision error

STEPS INSIDE FUNCTION after numberEquals(0.1 + 0.2, 0.3) call:
= Math.abs((0.1 + 0.2) - 0.3) < Number.EPSILON
= Math.abs((0.30000000000000004) - 0.3) < Number.EPSILON
= Math.abs((5.551115123125783e-17) - 0.3) < Number.EPSILON
= Math.abs((5.551115123125783e-17) - 0.3) < 2.220446049250313e-16

Hence it returned “true”.

This function works by checking whether the difference between the two numbers are smaller than Number.EPSILON. Remember that Number.EPSILON is the smallest difference between two representable numbers. The difference between 0.1+0.2 and 0.3 will be smaller than Number.EPSILON.

❤️ Thank You For Making It To The End. Kudos to you. Give a clap and share it to show your support and love 👏🎯

--

--

Gaurav Singh
Gaurav Singh

Written by Gaurav Singh

🕷Of 🕸 🌏 @thoughtworks

Responses (2)