The problem is that Decimal(1.2225) is not what you expect it to be:

>>> Decimal(1.2225)
Decimal('1.2224999999999999200639422269887290894985198974609375')

You are using a float to the create the decimal, but that float is already too imprecise for your use case. As you can see, it’s actually a 1.222499 so it is smaller than 1.2225 and as such would correctly round down.

In order to fix that, you need to create decimals with correct precision, by passing them as strings. Then everything works as expected:

>>> x = Decimal('1.2225')
>>> x.quantize(Decimal('0.001'), ROUND_HALF_UP)
Decimal('1.223')
>>> y = Decimal('1.2224')
>>> y.quantize(Decimal('0.001'), ROUND_HALF_UP)
Decimal('1.222')
Answer from poke on Stack Overflow
🌐
Tutorialspoint
tutorialspoint.com › python › number_round.htm
Python round() Function
round(80.23456, 2) : 80.23 round(100.000056, 3) : 100.0 · In here the number of decimal points to which the given number will be rounded is not present.
People also ask

How to use round function in Python with decimal places?
You can specify decimal places using the second argument. For instance, round(3.14159, 2) returns 3.14. This is useful when displaying currency, scientific data, or percentages where consistent precision is required for readability and accuracy.
🌐
upgrad.com
upgrad.com › home › blog › data science › understanding python round function: guide to precise rounding
Round Function in Python [2025] – Explained for Beginners
How to round numbers in pandas using Python round function?
Pandas integrates Python rounding with the round() method on Series or DataFrames. Example: df['column'].round(2) rounds values in a column to two decimals, simplifying data cleaning and reporting.
🌐
upgrad.com
upgrad.com › home › blog › data science › understanding python round function: guide to precise rounding
Round Function in Python [2025] – Explained for Beginners
What is the Python round function?
The Python round function is a built-in function that rounds a number to a specified number of decimal places or to the nearest integer. It helps maintain numerical precision, making calculations and data presentation cleaner and more accurate in Python programs.
🌐
upgrad.com
upgrad.com › home › blog › data science › understanding python round function: guide to precise rounding
Round Function in Python [2025] – Explained for Beginners
🌐
W3Schools
w3schools.com › python › ref_func_round.asp
Python round() Function
Python Examples Python Compiler Python Exercises Python Quiz Python Challenges Python Server Python Syllabus Python Study Plan Python Interview Q&A Python Bootcamp Python Certificate Python Training ... The round() function returns a floating point number that is a rounded version of the specified number, with the specified number of decimals.
🌐
Inspector
inspector.dev › home › round up numbers to integer in python – fast tips
Round Up Numbers to Integer in Python - Inspector.dev
June 17, 2025 - The simplest way to round a number in Python is to use the built-in round() function. The round() function takes a number as the first argument and an optional second argument to specify the number of decimal places to round to.
🌐
Finxter
blog.finxter.com › 5-best-ways-to-round-float-to-3-decimals-in-python
5 Best Ways to Round Float to 3 Decimals in Python – Be on the Right Side of Change
The most common method for rounding numbers in Python is the built-in round() function. It is straightforward and enables you to specify the number of decimal places to which you’d like to round your float. The function takes two arguments: the number itself and the number of decimal places.
🌐
Upgrad
upgrad.com › home › blog › data science › understanding python round function: guide to precise rounding
Round Function in Python [2025] – Explained for Beginners
October 8, 2025 - You can specify decimal places using the second argument. For instance, round(3.14159, 2) returns 3.14. This is useful when displaying currency, scientific data, or percentages where consistent precision is required for readability and accuracy.
🌐
Bobby Hadz
bobbyhadz.com › blog › python-round-float-3-decimal-places
Round a Float to 1, 2 or 3 Decimal places in Python | bobbyhadz
Use the `round()` function to round a float to 2 or 3 decimal places, e.g. `result = round(6.36789, 2)`.
Find elsewhere
🌐
TradingCode
tradingcode.net › python › math › round-decimals
How to round decimal places up and down in Python? • TradingCode
With Python’s round() function we can round decimal places up and down. The function needs two arguments for that. The first is the value to round. The second is the number of digits after the decimal point (.) to round to (Lutz, 2013; Sweigart, ...
🌐
Python
docs.python.org › 3 › library › decimal.html
decimal — Decimal fixed-point and floating-point arithmetic — Python 3.14.3 documentation
For example, this converts Decimal('123E+1') to Decimal('1.23E+3'). ... Identical to the to_integral_value() method. The to_integral name has been kept for compatibility with older versions.
🌐
Mimo
mimo.org › glossary › python › round-function
Mimo: The coding platform you need to learn Web Development, Python, and more.
In this example, the first line rounds 3.14159 to the nearest integer (3), while the second line rounds it to two decimal places (3.14).
🌐
Real Python
realpython.com › python-rounding
How to Round Numbers in Python – Real Python
December 7, 2024 - It’s an algorithm! For example, the number 2.5 rounded to the nearest whole number is 3. The number 1.64 rounded to one decimal place is 1.6. Now open up an interpreter session and round 2.5 to the nearest whole number using Python’s built-in round() function:
🌐
GeeksforGeeks
geeksforgeeks.org › python › round-function-python
round() function in Python - GeeksforGeeks
We usually work with just two or three digits to the right of the decimal point when there is no exact equivalent to the fraction in decimal. ... Note: In Python, if we round off numbers to floor or ceil without giving the second parameter, it will return 15.0 for example and in Python 3 it returns 15, so to avoid this we can use (int) type conversion in Python.
Published   August 7, 2024
🌐
NumPy
numpy.org › doc › 2.1 › reference › generated › numpy.round.html
numpy.round — NumPy v2.1 Manual
>>> np.format_float_positional(56294995342131.5, precision=3) '56294995342131.5' The float printing routines use an accurate but much more computationally demanding algorithm to compute the number of digits after the decimal point. Alternatively, Python’s builtin round function uses a more ...
🌐
Programiz
programiz.com › python-programming › methods › built-in › round
Python round()
from decimal import Decimal # normal float num = 2.675 · print(round(num, 2)) # using decimal.Decimal (passed float as string for precision) num = Decimal('2.675')
🌐
Server Academy
serveracademy.com › blog › python-round-function-tutorial
Python Round() Function Tutorial - Server Academy
It’s a straightforward tool to ... This parameter is optional. If not specified, round() will return the nearest integer. number = 3......
🌐
KnowledgeHut
knowledgehut.com › home › blog › data science › understanding python round function: guide to precise rounding
How to Round Numbers in Python? With Examples
October 8, 2025 - You can specify decimal places using the second argument. For instance, round(3.14159, 2) returns 3.14. This is useful when displaying currency, scientific data, or percentages where consistent precision is required for readability and accuracy.
🌐
freeCodeCamp
freecodecamp.org › news › how-to-round-to-2-decimal-places-in-python
How to Round to 2 Decimal Places in Python
August 22, 2022 - The syntax is: ... The function ... num = 24.89 rounded = round(num, 1) print(rounded) # 24.9 ... num = 20.4454 rounded3 = round(num, 3) # to 3 decimal ......
🌐
Vultr Docs
docs.vultr.com › python › built-in › round
Python round() - Round Numeric Value | Vultr Docs
November 27, 2024 - This example rounds 9.87654 to 9.877. Specifying 3 as the second argument rounds the number to three decimal places. Understand that Python uses the rounding half to even strategy.
Top answer
1 of 6
205

I feel compelled to provide a counterpoint to Ashwini Chaudhary's answer. Despite appearances, the two-argument form of the round function does not round a Python float to a given number of decimal places, and it's often not the solution you want, even when you think it is. Let me explain...

The ability to round a (Python) float to some number of decimal places is something that's frequently requested, but turns out to be rarely what's actually needed. The beguilingly simple answer round(x, number_of_places) is something of an attractive nuisance: it looks as though it does what you want, but thanks to the fact that Python floats are stored internally in binary, it's doing something rather subtler. Consider the following example:

>>> round(52.15, 1)
52.1

With a naive understanding of what round does, this looks wrong: surely it should be rounding up to 52.2 rather than down to 52.1? To understand why such behaviours can't be relied upon, you need to appreciate that while this looks like a simple decimal-to-decimal operation, it's far from simple.

So here's what's really happening in the example above. (deep breath) We're displaying a decimal representation of the nearest binary floating-point number to the nearest n-digits-after-the-point decimal number to a binary floating-point approximation of a numeric literal written in decimal. So to get from the original numeric literal to the displayed output, the underlying machinery has made four separate conversions between binary and decimal formats, two in each direction. Breaking it down (and with the usual disclaimers about assuming IEEE 754 binary64 format, round-ties-to-even rounding, and IEEE 754 rules):

  1. First the numeric literal 52.15 gets parsed and converted to a Python float. The actual number stored is 7339460017730355 * 2**-47, or 52.14999999999999857891452847979962825775146484375.

  2. Internally as the first step of the round operation, Python computes the closest 1-digit-after-the-point decimal string to the stored number. Since that stored number is a touch under the original value of 52.15, we end up rounding down and getting a string 52.1. This explains why we're getting 52.1 as the final output instead of 52.2.

  3. Then in the second step of the round operation, Python turns that string back into a float, getting the closest binary floating-point number to 52.1, which is now 7332423143312589 * 2**-47, or 52.10000000000000142108547152020037174224853515625.

  4. Finally, as part of Python's read-eval-print loop (REPL), the floating-point value is displayed (in decimal). That involves converting the binary value back to a decimal string, getting 52.1 as the final output.

In Python 2.7 and later, we have the pleasant situation that the two conversions in step 3 and 4 cancel each other out. That's due to Python's choice of repr implementation, which produces the shortest decimal value guaranteed to round correctly to the actual float. One consequence of that choice is that if you start with any (not too large, not too small) decimal literal with 15 or fewer significant digits then the corresponding float will be displayed showing those exact same digits:

>>> x = 15.34509809234
>>> x
15.34509809234

Unfortunately, this furthers the illusion that Python is storing values in decimal. Not so in Python 2.6, though! Here's the original example executed in Python 2.6:

>>> round(52.15, 1)
52.200000000000003

Not only do we round in the opposite direction, getting 52.2 instead of 52.1, but the displayed value doesn't even print as 52.2! This behaviour has caused numerous reports to the Python bug tracker along the lines of "round is broken!". But it's not round that's broken, it's user expectations. (Okay, okay, round is a little bit broken in Python 2.6, in that it doesn't use correct rounding.)

Short version: if you're using two-argument round, and you're expecting predictable behaviour from a binary approximation to a decimal round of a binary approximation to a decimal halfway case, you're asking for trouble.

So enough with the "two-argument round is bad" argument. What should you be using instead? There are a few possibilities, depending on what you're trying to do.

  • If you're rounding for display purposes, then you don't want a float result at all; you want a string. In that case the answer is to use string formatting:

    >>> format(66.66666666666, '.4f')
    '66.6667'
    >>> format(1.29578293, '.6f')
    '1.295783'
    

    Even then, one has to be aware of the internal binary representation in order not to be surprised by the behaviour of apparent decimal halfway cases.

    >>> format(52.15, '.1f')
    '52.1'
    
  • If you're operating in a context where it matters which direction decimal halfway cases are rounded (for example, in some financial contexts), you might want to represent your numbers using the Decimal type. Doing a decimal round on the Decimal type makes a lot more sense than on a binary type (equally, rounding to a fixed number of binary places makes perfect sense on a binary type). Moreover, the decimal module gives you better control of the rounding mode. In Python 3, round does the job directly. In Python 2, you need the quantize method.

    >>> Decimal('66.66666666666').quantize(Decimal('1e-4'))
    Decimal('66.6667')
    >>> Decimal('1.29578293').quantize(Decimal('1e-6'))
    Decimal('1.295783')
    
  • In rare cases, the two-argument version of round really is what you want: perhaps you're binning floats into bins of size 0.01, and you don't particularly care which way border cases go. However, these cases are rare, and it's difficult to justify the existence of the two-argument version of the round builtin based on those cases alone.

2 of 6
115

Use the built-in function round():

In [23]: round(66.66666666666,4)
Out[23]: 66.6667

In [24]: round(1.29578293,6)
Out[24]: 1.295783

help on round():

round(number[, ndigits]) -> floating point number

Round a number to a given precision in decimal digits (default 0 digits). This always returns a floating point number. Precision may be negative.