【Python】银行家算法(四舍六入五成双)和使用decimal进行四舍五入处理

在python3中,round(num,n)和’%.nf’%num都是使用银行家算法进行小数位的处理的,即四舍六入五成双。(python2不记得了)

  • 四舍六入五成双介绍
    和四舍五入不同的是,对于最大小数位下一位为5,其后没其他小数的情况的处理
    例如:1.1x5保留两位小数,最大小数位后为5,这时就判断x是奇数还是偶数,如果是偶数,“5”就舍,如果是奇数,“5”就入

示例(保留2位小数处理):

数值四舍五入银行家算法
1.1251.131.12
1.1351.141.14
1.1250011.131.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取
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值