### Question :

I am getting a lot of decimals in the output of this code (Fahrenheit to Celsius converter).

My code currently looks like this:

```
def main():
printC(formeln(typeHere()))
def typeHere():
global Fahrenheit
try:
Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!n"))
except ValueError:
print "nYour insertion was not a digit!"
print "We've put your Fahrenheit value to 50!"
Fahrenheit = 50
return Fahrenheit
def formeln(c):
Celsius = (Fahrenheit - 32.00) * 5.00/9.00
return Celsius
def printC(answer):
answer = str(answer)
print "nYour Celsius value is " + answer + " C.n"
main()
```

So my question is, how do I make the program round every answer to the 2nd decimal place?

##
Answer #1:

You can use the `round`

function, which takes as its first argument the number and the second argument is the precision after the decimal point.

In your case, it would be:

```
answer = str(round(answer, 2))
```

##
Answer #2:

Using `str.format()`

‘s syntax to *display* `answer`

with two decimal places (without altering the underlying value of `answer`

):

```
def printC(answer):
print("nYour Celsius value is {:0.2f}ºC.n".format(answer))
```

Where:

`:`

introduces the format spec`0`

enables sign-aware zero-padding for numeric types`.2`

sets the precision to`2`

`f`

displays the number as a fixed-point number

##
Answer #3:

Most answers suggested `round`

or `format`

. `round`

sometimes rounds up, and in my case I needed the *value* of my variable to be rounded down and not just displayed as such.

```
round(2.357, 2) # -> 2.36
```

I found the answer here: How do I round a floating point number up to a certain decimal place?

```
import math
v = 2.357
print(math.ceil(v*100)/100) # -> 2.36
print(math.floor(v*100)/100) # -> 2.35
```

or:

```
from math import floor, ceil
def roundDown(n, d=8):
d = int('1' + ('0' * d))
return floor(n * d) / d
def roundUp(n, d=8):
d = int('1' + ('0' * d))
return ceil(n * d) / d
```

##
Answer #4:

```
float(str(round(answer, 2)))
float(str(round(0.0556781255, 2)))
```

##
Answer #5:

If you just want to print the rounded result out, you can use the f-strings introduced since Python 3.6. The syntax is the same as `str.format()`

‘s format string syntax, except you put a `f`

in front of the literal string, and you put the variables directly in the string, within the curly braces.

`.2f`

indicates rounding to two decimal places:

```
number = 3.1415926
print(f"The number rounded to two decimal places is {number:.2f}")
```

Output:

```
The number rounded to two decimal places is 3.14
```

##
Answer #6:

You want to round your answer.

`round(value,significantDigit)`

is the ordinary solution to do this, however this ** sometimes** does not operate as one would expect from a math perspective when the digit immediately inferior (to the left of) the digit you’re rounding to has a

`5`

.Here’s some examples of this unpredictable behavior:

```
>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01
```

Assuming your intent is to do the traditional rounding for statistics in the sciences, this is a handy wrapper to get the `round`

function working as expected needing to `import`

extra stuff like `Decimal`

.

```
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
```

Aha! So based on this we can make a function…

```
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1), digits)
```

Basically this adds a really small value to the string to force it to round up properly on the unpredictable instances where it doesn’t ordinarily with the `round`

function when you expect it to. A convenient value to add is `1e-X`

where `X`

is the length of the number string you’re trying to use `round`

on plus `1`

.

The approach of using `10**(-len(val)-1)`

was deliberate, as it the largest small number you can add to force the shift, while also ensuring that the value you add never changes the rounding even if the decimal `.`

is missing. I could use just `10**(-len(val))`

with a condiditional `if (val>1)`

to subtract `1`

more… but it’s simpler to just always subtract the `1`

as that won’t change much the applicable range of decimal numbers this workaround can properly handle. This approach will fail if your values reaches the limits of the type, this will fail, but for nearly the entire range of valid decimal values it should work.

So the finished code will be something like:

```
def main():
printC(formeln(typeHere()))
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1))
def typeHere():
global Fahrenheit
try:
Fahrenheit = int(raw_input("Hi! Enter Fahrenheit value, and get it in Celsius!n"))
except ValueError:
print "nYour insertion was not a digit!"
print "We've put your Fahrenheit value to 50!"
Fahrenheit = 50
return Fahrenheit
def formeln(c):
Celsius = (Fahrenheit - 32.00) * 5.00/9.00
return Celsius
def printC(answer):
answer = str(roundTraditional(answer,2))
print "nYour Celsius value is " + answer + " C.n"
main()
```

…should give you the results you expect.

You can also use the decimal library to accomplish this, but the wrapper I propose is simpler and may be preferred in some cases.

**Edit:** Thanks Blckknght for pointing out that the `5`

fringe case occurs only for certain values here.

##
Answer #7:

If you need **avoid floating point problem** on rounding numbers for accounting, you can use numpy round.

You need install numpy :

```
pip install numpy
```

and the code :

```
import numpy as np
print(round(2.675, 2))
print(float(np.round(2.675, 2)))
```

prints

```
2.67
2.68
```

You should use that if you manage money with legal rounding.

##
Answer #8:

Just use the formatting with %.2f which gives you rounding down to 2 decimals.

```
def printC(answer):
print "nYour Celsius value is %.2f C.n" % answer
```