在python3中,round(num,n)和’%.nf’%num都是使用银行家算法进行小数位的处理的,即四舍六入五成双。(python2不记得了)
-
四舍六入五成双介绍
和四舍五入不同的是,对于最大小数位下一位为5,其后没其他小数的情况的处理
例如:1.1×5保留两位小数,最大小数位后为5,这时就判断x是奇数还是偶数,如果是偶数,“5”就舍,如果是奇数,“5”就入
示例(保留2位小数处理):
数值 | 四舍五入 | 银行家算法 |
---|---|---|
1.125 | 1.13 | 1.12 |
1.135 | 1.14 | 1.14 |
1.125001 | 1.13 | 1.13 |
-
使用Decimal进行精度处理
在百度搜索四舍五入保留两位小数位,会看到有文章写decimal.getcontext().prec=2来实现,实际在python3中,这样是不行的,prec设置的总长度,而不是小数位数;设置prec就类似于在数据库中Decimal(m,n)设置m。
可以使用Decimal()类的quantize(exp,rounding,context)来实现小数位设置
import decimal
a = decimal.Decimal("1.1245")
a.quantize(decimal.Decimal("0.00"),decimal.ROUND_HALF_UP) #结果: Decimal(“1.12”)
-
quantize方法入参介绍
quantize(exp,rounding=None,context=None)
参数 | 说明 |
---|---|
exp
|
数据(小数位)处理成什么样式,可传入int或者Decimal
传入个int类型的值,表示不保留小数位 传入Decimal(“0.00”)表示保留2位小数,Decimal(“0.000”)表示保留3位小数 |
rounding
|
小数位处理方式,默认为None
入参为空就从上下文取rounding属性(rouding字段的处理是在context入参处理逻辑之后); decimal上下文的rounding默认值是ROUND_HALF_EVEN(银行家算法) |
context
|
上下文
如果没传,就取当前全局上下文 |
- rounding参数介绍
值 | 说明 |
---|---|
ROUND_CEILING
|
总是趋向于无穷大向上取
|
ROUND_DOWN
|
总是趋向于0取
|
ROUND_FLOOR
|
总是趋向于负无穷向下取
|
ROUND_HALF_DOWN
|
如果最后一个有效数字大于或等于五则朝0反方向取,否则,朝0取
|
ROUND_HALF_EVEN
|
银行家算法
|
ROUND_HALF_UP
|
四舍五入,与ROUND_HALF_DOWN方向相反
|
ROUND_UP
|
总是趋向于0的反方向取(正数趋向于正无穷,负数趋向于负无穷)
|
ROUND_05UP
|
如果最后一位是0或5则朝0的反方向取,否则趋向于0取
|