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

结果:

使用round函数
1.0
1.02
1.04
1.06
1.08
1.01
1.03
1.05
1.07
1.09

保留两位小数,小数第三位是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))

结果:

使用Decimal模块
1.01
1.02
1.03
1.04
1.06
1.07
1.08
1.09
1.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函数是上面哪种方式呢?还是都不属于呢?

猜你喜欢

转载自blog.csdn.net/mrtwenty/article/details/124621430