Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rounding to two decimal places in Python 2.7?

Using Python 2.7 how do I round my numbers to two decimal places rather than the 10 or so it gives?

print "financial return of outcome 1 =","$"+str(out1) 
like image 627
RCN Avatar asked Jul 04 '13 12:07

RCN


People also ask

How do you round to 2 decimal places in Python?

Use str. format() with “{:. 2f}” as string and float as a number to display 2 decimal places in Python. Call print and it will display the float with 2 decimal places in the console.


2 Answers

Use the built-in function round():

>>> round(1.2345,2) 1.23 >>> round(1.5145,2) 1.51 >>> round(1.679,2) 1.68 

Or built-in function format():

>>> format(1.2345, '.2f') '1.23' >>> format(1.679, '.2f') '1.68' 

Or new style string formatting:

>>> "{:.2f}".format(1.2345) '1.23 >>> "{:.2f}".format(1.679) '1.68' 

Or old style string formatting:

>>> "%.2f" % (1.679) '1.68' 

help on round:

>>> print round.__doc__ 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. 
like image 193
Ashwini Chaudhary Avatar answered Sep 23 '22 13:09

Ashwini Chaudhary


Since you're talking about financial figures, you DO NOT WANT to use floating-point arithmetic. You're better off using Decimal.

>>> from decimal import Decimal >>> Decimal("33.505") Decimal('33.505') 

Text output formatting with new-style format() (defaults to half-even rounding):

>>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.505"))) financial return of outcome 1 = 33.50 >>> print("financial return of outcome 1 = {:.2f}".format(Decimal("33.515"))) financial return of outcome 1 = 33.52 

See the differences in rounding due to floating-point imprecision:

>>> round(33.505, 2) 33.51 >>> round(Decimal("33.505"), 2)  # This converts back to float (wrong) 33.51 >>> Decimal(33.505)  # Don't init Decimal from floating-point Decimal('33.50500000000000255795384873636066913604736328125') 

Proper way to round financial values:

>>> Decimal("33.505").quantize(Decimal("0.01"))  # Half-even rounding by default Decimal('33.50') 

It is also common to have other types of rounding in different transactions:

>>> import decimal >>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_DOWN) Decimal('33.50') >>> Decimal("33.505").quantize(Decimal("0.01"), decimal.ROUND_HALF_UP) Decimal('33.51') 

Remember that if you're simulating return outcome, you possibly will have to round at each interest period, since you can't pay/receive cent fractions, nor receive interest over cent fractions. For simulations it's pretty common to just use floating-point due to inherent uncertainties, but if doing so, always remember that the error is there. As such, even fixed-interest investments might differ a bit in returns because of this.

like image 30
Ronan Paixão Avatar answered Sep 24 '22 13:09

Ronan Paixão