You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:27:06