Suppose I have `8.8333333333333339`

, and I want to convert it to `8.84`

. How can I accomplish this in Python?

`round(8.8333333333333339, 2)`

gives `8.83`

and not `8.84`

. I am new to Python or programming in general.

I don't want to print it as a string, and the result will be further used. For more information on the problem, please check *Tim Wilson's Python Programming Tips: Loan and payment calculator*.

`8.833333333339`

(or `8.833333333333334`

, the result of `106.00/12`

) properly rounded to two decimal places is `8.83`

. Mathematically it sounds like what you want is a ceiling function. The one in Python's `math`

module is named `ceil`

:

```
import math
v = 8.8333333333333339
print(math.ceil(v*100)/100) # -> 8.84
```

Respectively, the floor and ceiling functions generally map a real number to the largest previous or smallest following integer which has zero decimal places — so to use them for 2 decimal places the number is first multiplied by 10^{2} (or 100) to shift the decimal point and is then divided by it afterwards to compensate.

If you don't want to use the `math`

module for some reason, you can use this (minimally tested) implementation I just wrote:

```
def ceiling(x):
n = int(x)
return n if n-1 < x <= n else n+1
```

From the sample output it appears that they ** rounded up** the monthly payment, which is what many call the effect of the ceiling function. This means that each month a little more than

`8.76`

.It would have been equally valid to use normal rounding producing a monthly payment of `8.83`

and a slightly higher final payment of `8.87`

. However, in the real world people generally don't like to have their payments go up, so rounding up each payment is the common practice — it also returns the money to the lender more quickly.

This is normal (and has nothing to do with Python) because 8.83 cannot be represented exactly as a binary float, just as 1/3 cannot be represented exactly in decimal (0.333333... ad infinitum).

If you want to ensure absolute precision, you need the `decimal`

module:

```
>>> import decimal
>>> a = decimal.Decimal("8.833333333339")
>>> print(round(a,2))
8.83
```

Licensed under: CC-BY-SA with attribution

Not affiliated with: Stack Overflow