python中有太多对小数得操作,如保留小数位,强制转化为整数等等,其实对于大部分人而言,其中小数位的处理究竟是“四舍五入”或“四舍六入”又或者是“四舍六入五成双”。下面我们来总结一下:
int强制转换
在Python中int强制转化操作是一种“向零舍入”的方式,即需要处理的数字直接舍弃:
print(5.9) # 5
print(-5.9) # -5
这并不是我们所需要的“四舍五入”,如果要实现“四舍五入”,我们可以让其加/减上0.5(正数加0.5,负数减0.5)再进行强制转换:
a = 5.4
b = 5.5
print(int(a + 0.5)) # 5
print(int(b + 0.5)) # 6
print(int(-a - 0.5)) # -5
print(int(-b - 0.5)) # -6
decimal.quantize
decimal
是Python对小数处理非常友好的标准库,decimal
有以下几种舍入模式:
decimal.ROUND_CEILING
: 向正无穷舍入。
# 保留0位小数
a = 5.1
b = 5.9
print(Decimal(a).quantize(Decimal('0'), decimal.ROUND_CEILING)) # 6
print(Decimal(b).quantize(Decimal('0'), decimal.ROUND_CEILING)) # 6
print(Decimal(-a).quantize(Decimal('0'), decimal.ROUND_CEILING)) # -5
print(Decimal(-b).quantize(Decimal('0'), decimal.ROUND_CEILING)) # -5
decimal.ROUND_DOWN
: 向零舍入
# 保留0位小数
a = 5.1
b = 5.9
print(Decimal(a).quantize(Decimal('0'), decimal.ROUND_DOWN)) # 5
print(Decimal(b).quantize(Decimal('0'), decimal.ROUND_DOWN)) # 5
print(Decimal(-a).quantize(Decimal('0'), decimal.ROUND_DOWN)) # -5
print(Decimal(-b).quantize(Decimal('0'), decimal.ROUND_DOWN)) # -5
decimal.ROUND_FLOOR
: 向负无