Rounding in Python

本文所有例子均基于Python3.1.2

1Overview

首先简单介绍几种常见的舍入模式:

ROUND_CEILING:向正无穷大(Infinity)方向舍入。

ROUND_FLOOR:向正无穷大(–Infinity)方向舍入。

ROUND_UP:向远离0的方向舍入。

ROUND_DOWN:向靠近0的方向舍入。

ROUND_HALF_UP:向最近的值舍入,如果相等则向远离0的方向舍入。

ROUND_HALF_DOWN:向最近的值舍入,如果相等则向靠近0的方向舍入。

ROUND_HALF_EVEN:向最近的值舍入,如果相等则向偶数方向舍入。

2Division

首先分析一下floordivision的例子:

>>>5//2,5.0//2,5//-2,5.0//-2

(2,2.0,-3,-3.0)

从以上例子中可以看出,跟C或者Java不同(采用ROUNDING_DOWN),Python的floordivision采用的舍入模式是ROUNDING_FLOOR。

需要注意的是,Python2.5(以及之前的版本)中对于整数除法操作,总是会截取结果的小数部分;Python3.0之后,无论除数为何类型,总是保留结果的小数部分。

3Conversion

将浮点数转换为整数时,采用ROUNDING_DOWN,例如:

>>>int(1.3),int(-1.3),int(1.5),int(-1.5),int(2.5),int(-2.5)

(1,-1,1,-1,2,-2)

4Rounding

如果使用内置的round函数将浮点数舍入为整数时,使用ROUNDING_HALF_EVEN,例如:

>>>round(1.3),round(-1.3),round(1.5),round(-1.5),round(2.5),round(-2.5)

(1,-1,2,-2,2,-2)

5Decimal

Java语言中BigDecimal默认的舍入模式是ROUNDING_UNNESSARY。Python中的Decimal计算时采用的舍入模式取决于当前的上下文。例如:

>>>importdecimal

>>>decimal.getcontext()

Context(prec=28,rounding=ROUND_HALF_EVEN,Emin=-999999999,Emax=999999999,capitals=1,flags=[],traps=[Overflow,InvalidOperation,DivisionByZero])

从以上例子中可以看出,当前默认的舍入模式是ROUND_HALF_EVEN。

此外,decimal模块也提供了几个预制的上下文:

BasicContext。采用ROUND_HALF_UP。

ExtendedContext。采用ROUND_HALF_EVEN。

相关推荐