Hone

Lessons · Python · comparing decimals

Decimals that are almost equal

0.1 + 0.2 is 0.30000000000000004, so compare floats with a tolerance, never with ==.

Hone is a place to practise programming. This is one of its lessons, written out in full and free to read without an account.

What it is for

Money totals, measurements, percentages: any sum of decimals drifts by a hair. A test of == that fails on a Tuesday because of rounding is a classic bug.

How to think about it

Ask: are these values the result of arithmetic? If so, compare abs(a - b) < small_number, or use math.isclose. For money, work in integer cents instead.

Worked example

a = 0.1 + 0.2
0.30000000000000004 in binary floating point.
print(a == 0.3)
False. The bug.
print(abs(a - 0.3) < 1e-9)
True. Close enough, and stated as such.
import math; print(math.isclose(a, 0.3))
The standard tool for exactly this.

Your turn

Check two totals agree to within a cent.

same = abs(total_a - total_b) < 

The trap

Fixing it by rounding both sides. round(2.675, 2) gives 2.67, not 2.68, for the same reason. Tolerance, not rounding.

Next in Python

Every Python lesson on one page

Practise comparing decimals on HoneA question on it now, a coding challenge where there is one, and it is remembered for review. Free, no email needed.