HSS - 1 year ago 43

Python Question

Suppose I am having 8.8333333333333339 and I want to convert it to 8.84, how can I accomplish this in python ? round(8.8333333333333339 , 2) gives 8.8300000000000001 and not 8.84. I am new to python or programming in general.

I don't want to print it as a string, the result will be further used. For more information on the problem please check this link http://openbookproject.net/pybiblio/practice/wilson/loan.php

Answer Source

`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 some 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.