• Python 浮点数的舍入,round与decimal舍入方式


    Python有一个内置函数round,我以为是可以用来四舍五入的,其实并不是,我们来试试看:
    测试环境是 Python 3.8.5,windows系统

    round函数

    print("使用round函数")
    print(round(1.005, 2))  # 1
    print(round(1.025, 2))  # 1.02
    print(round(1.045, 2))  # 1.04
    print(round(1.065, 2))  # 1.06
    print(round(1.085, 2))  # 1.08
    print(round(1.015, 2))  # 1.01
    print(round(1.035, 2))  # 1.03
    print(round(1.055, 2))  # 1.05
    print(round(1.075, 2))  # 1.07
    print(round(1.095, 2))  # 1.09
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果:

    使用round函数
    1.0
    1.02
    1.04
    1.06
    1.08
    1.01
    1.03
    1.05
    1.07
    1.09
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    保留两位小数,小数第三位是5,按理来说,都应该进1,结果却跟我们想象的不太一样,那我们应该怎样实现四舍五入呢?

    decimal模块

    ROUND_HALF_UP 用来实现四舍五入

    from decimal import ROUND_HALF_UP
    from decimal import Decimal
    
    print('使用Decimal模块')
    print(Decimal('1.011').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.022').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.033').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.044').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.055').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.066').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.077').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.088').quantize(Decimal('0.01'), ROUND_HALF_UP))
    print(Decimal('1.099').quantize(Decimal('0.01'), ROUND_HALF_UP))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果:

    使用Decimal模块
    1.01
    1.02
    1.03
    1.04
    1.06
    1.07
    1.08
    1.09
    1.10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    除了了四舍五入,decimal还有不同的舍入模式,下面就是官方手册的说明:

    模式解释
    decimal.ROUND_CEILING舍入方向为 Infinity。
    decimal.ROUND_DOWN舍入方向为零。
    decimal.ROUND_FLOOR舍入方向为 -Infinity。
    decimal.ROUND_HALF_DOWN舍入到最接近的数,同样接近则舍入方向为零。
    decimal.ROUND_HALF_EVEN舍入到最接近的数,同样接近则舍入到最接近的偶数。
    decimal.ROUND_HALF_UP舍入到最接近的数,同样接近则舍入到零的反方向。
    decimal.ROUND_UP舍入到零的反方向。
    decimal.ROUND_05UP如果最后一位朝零的方向舍入后为 0 或 5 则舍入到零的反方向;否则舍入方向为零。

    其中 ROUND_HALF_UP 就是四舍五入,ROUND_HALF_EVEN 就是 银行家舍入法

    那么请问round函数是上面哪种方式呢?还是都不属于呢?

  • 相关阅读:
    2022.8.9考试独特的投标拍卖--800题解
    被裁员一个月后,我被面试官的一套性能优化面试题给问自闭了
    zip压缩包密码怎么解开,zip压缩包权限限制怎么解除?
    计算机毕业设计uniapp+python餐厅菜品点餐系统小程序51988+
    TypeScript入门
    ES6 Set数据结构
    家电产品宣传册如何制作?
    c++ 类的特殊成员函数:移动构造函数(五)
    MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力
    穿越功耗墙,我们该从哪些方面提升“性能”?
  • 原文地址:https://blog.csdn.net/mrtwenty/article/details/124621430