Python Decimal四舍五入问题:如何将611.05/10保留两位小数得到61.11
问题原因
Python 默认的float类型是双精度二进制浮点数,无法精确表示部分十进制小数。你可以先打印611.05/10.0的精确存储值验证:
print("{0:.20f}".format(611.05/10.0))
输出结果会小于61.105,所以直接用round或者仅修改decimal全局规则都不会得到预期的四舍五入结果。你之前修改规则不生效的核心原因是没有用decimal.Decimal类型参与运算,规则只对decimal类型生效。
正确实现方案
你需要全程使用decimal.Decimal类型做运算,才能让ROUND_HALF_UP规则生效,注意必须从字符串初始化Decimal对象,避免float转存时已经丢失精度:
import decimal from decimal import Decimal, ROUND_HALF_UP # 配置全局规则 ctx = decimal.getcontext() ctx.prec = 20 # 设置足够容纳运算过程的精度即可 ctx.rounding = ROUND_HALF_UP # 从字符串初始化Decimal对象 num1 = Decimal("611.05") num2 = Decimal("10.0") res = num1 / num2 # 保留两位小数 final_res = res.quantize(Decimal("0.00")) print(final_res) # 输出 61.11
轻量替代方案
如果精度要求不高、数值范围不大,也可以用放大取整的方法实现:
def round_half_up(num, digits=2): factor = 10 ** digits return int(num * factor + 0.5) / factor print(round_half_up(611.05/10, 2)) # 输出 61.11
注意:该方案极端场景下可能存在精度误差,高精度运算优先使用decimal模块。
内容的提问来源于stack exchange,提问作者Bhavesh Odedra
相关产品推荐
相关产品推荐

