0


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

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

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

示例(保留2位小数处理):
数值四舍五入银行家算法1.1251.131.121.1351.141.141.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取

标签: python

本文转载自: https://blog.csdn.net/weixin_42584156/article/details/122150778
版权归原作者 在墙角蹲着画圈圈 所有, 如有侵权,请联系我们删除。

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

还没有评论