How many decimal places should a percentage have?
Decide how many decimal places a number deserves from how many cases are behind it, and round at the end, not along the way.
Free course. Your Maestro, an AI, .
Ana, from marketing at Tiendas La Ceiba, sends in her quarterly report. Two lines stand out:
Repeat purchases at Ojo de Agua rose from 63.333% to 64.516%.
42.50% of surveyed customers would recommend the store.
They look rigorous: three decimal places sound like careful measurement. But Ojo de Agua has 310 cardholder customers, and the survey went to 40 people. (Ana, the survey and the chain are invented for the course.) Before you go on, do a quick calculation.
Check yourself: In the survey, 17 out of 40 customers said they would recommend the store: 42.50%. If one more customer had said yes, how much would the percentage change?
Every decimal place is a promise
When you write 42.50%, you're telling the reader you could tell 42.50% from 42.51%. With 40 people that's impossible: the percentage can only be 40.0%, 42.5%, 45.0% and so on, in jumps of 2.5 points. Extra decimal places add no information; they add a certainty the data doesn't have. That's called false precision.
A rule that works almost every time: one case moves the percentage by 100 ÷ n points, where n is the number of cases in the denominator. Don't show decimal places finer than that.
- With 40 respondents, one case moves 2.5 points. Report "17 of 40" or "about 4 in 10"; if you need a percentage, 43% with no decimals.
- With Ojo de Agua's 310 customers, one case moves 0.32 points. A whole-number percentage says everything the data knows.
- With Centro's 10,400 customers, one case moves 0.01 points. There, one decimal place is justified.
Rounding has one more trap, and it shows up every time you report the parts of a total.
The parts of a total, each rounded to a whole number, as in a report table or a pie chart.
The parts of a total, each rounded to a whole number, as in a report table or a pie chart.
Three equal parts
Example 1 of 2
ventas = [1, 1, 1]
total = sum(ventas)
partes = [round(v / total * 100) for v in ventas]
print(partes)
print(sum(partes))
A guess is fine: it's kept as you wrote it, so you can compare. Only you and your Maestro see your predictions.
Example 2 of 2, opens once you explain this one
Not adding up to 100 isn't an error
If your rounded percentages add up to 99 or 101, don't fix them by nudging one up or down by hand: that really would be changing the data. The honest thing is to leave them as they are and add a note: percentages may not add up to 100 because of rounding. Anyone reading a report with that note gets it right away.
What does cause problems is rounding before you do the math. Go back to Ceiba Express, from the percentage points page: its repeat purchase rate went from 25.0% to 28.846...%. If you first round to 28.8% and then calculate the change, you get 15.2%. With the full numbers it's 15.4%. Two tenths won't change any decision, but in a chain of calculations (the change in an average of a rate) the error builds up step by step.
Ask your Maestro why rounding at the start can move the final result.
Try it
Calculate each store's 2025 repeat purchase rate and, next to it, how many points a single customer would move it. The table goes from the store with the fewest customers to the one with the most.
Round recompra to one decimal place and add the column unclientemueve: how many points the repeat purchase rate changes with a single customer, 100.0 / clientes2025, rounded to two decimal places. You're done when the first row is Ojo de Agua with 64.5 and 0.32.
Your turn
Round recompra to one decimal place and add the column un_cliente_mueve: how many points the repeat purchase rate changes with a single customer, 100.0 / clientes_2025, rounded to two decimal places. You're done when the first row is Ojo de Agua with 64.5 and 0.32.
Tables: sucursales (sucursal, municipio, ventas_2024, ventas_2025, clientes_2024, recompraron_2024, clientes_2025, recompraron_2025)
sucursales · 24 rows
| Column | Type |
|---|---|
| sucursal Nombre de la sucursal. | VARCHAR |
| municipio Municipio (ficticio) donde está. | VARCHAR |
| ventas_2024 Ventas del año 2024, en pesos. | BIGINT |
| ventas_2025 Ventas del año 2025, en pesos. | BIGINT |
| clientes_2024 Clientes con tarjeta que compraron en 2024. | BIGINT |
| recompraron_2024 De esos clientes, cuántos volvieron a comprar en menos de 90 días (2024). | BIGINT |
| clientes_2025 Clientes con tarjeta que compraron en 2025. | BIGINT |
| recompraron_2025 De esos clientes, cuántos volvieron a comprar en menos de 90 días (2025). | BIGINT |
First rows
| sucursal | municipio | ventas_2024 | ventas_2025 | clientes_2024 | recompraron_2024 | clientes_2025 | recompraron_2025 |
|---|---|---|---|---|---|---|---|
| Centro | Ciudad Ceiba | 41200000 | 43800000 | 9800 | 2840 | 10400 | 3120 |
| Chapultepec | Ciudad Ceiba | 27900000 | 26100000 | 7100 | 2200 | 6900 | 2140 |
| Plaza Norte | Ciudad Ceiba | 9400000 | 10100000 | 2600 | 960 | 2750 | 1070 |
Every run starts from fresh copies of the course's tables, so try anything. Tab indents; to leave the editor, press Escape, then Tab.
Ready to run your query.
Read the table from top to bottom. At Ojo de Agua, Cerro Prieto and El Encino, a single customer moves the repeat purchase rate by about a third of a point: writing 64.516% there promises thousandths of a number that moves in thirds. At Centro, with 10,400 customers, one customer moves it by a hundredth, and the decimal place is well earned.
With that, Ana's report can be rewritten:
Repeat purchases at Ojo de Agua barely changed: 190 of 300 customers in 2024 and 200 of 310 in 2025, about 6 in 10 both years.
17 of the 40 surveyed customers, about 4 in 10, would recommend the store.
It looks less impressive and says more. At Ojo de Agua, the difference between the two years is three or four customers.
False precision isn't only about percentages. A sales projection of "$43,812,547.23" for next year promises cents of something nobody knows to the nearest million. An average tenure of "8.4372 years" on a team of nine promises ten-thousandths of a year. In both cases, the number you show should reflect how much the person who calculated it actually knows.
Tip: Round at the end
Do all the math with the full numbers and round only what you're going to show. In a spreadsheet, change how many decimal places are displayed, not the stored value. In Python or SQL, round in the last step, not the first.
Paste a number from one of your reports and ask your Maestro how many decimal places it deserves.
One last question, with a rate like the ones in module 2.