为何设置ROUND_HALF_EVEN后,round(0.265,2)结果为0.27而非0.26?
为什么设置ROUND_HALF_EVEN后round(0.265,2)还是返回0.27?
问题核心原因
- 内置round函数不遵循decimal上下文规则:你调用的
round(a,2)中,a是float类型,这个round是Python内置函数,不会读取decimal模块的全局上下文设置,只遵循自身舍入逻辑。 - float类型的精度误差:0.265作为float存储时,实际值并非精确的0.265——从你打印的
Decimal(a)结果能看到,它是0.26500000000000001332267629550187848508358001708984375,这个值比0.265略大。内置round对这个数做两位小数舍入时,自然会得到0.27。
正确实现ROUND_HALF_EVEN舍入的方法
要让ROUND_HALF_EVEN规则生效,必须使用decimal模块的Decimal类型,并且用字符串而非float初始化Decimal(避免float精度误差),再通过Decimal的quantize方法或针对Decimal对象调用round函数实现舍入。
示例代码:
import decimal from decimal import Decimal, ROUND_HALF_EVEN # 确认全局上下文设置 print(decimal.getcontext()) # 用字符串初始化Decimal,保证数值精确 a = Decimal("0.265") print(a) # 方法1:使用quantize指定舍入规则和精度 result_quantize = a.quantize(Decimal("0.00"), rounding=ROUND_HALF_EVEN) # 方法2:直接round Decimal对象,自动遵循上下文的rounding规则 result_round = round(a, 2) print(result_quantize) # 输出: 0.26 print(result_round) # 输出: 0.26
内容的提问来源于stack exchange,提问作者Adil Khatri
相关产品推荐
相关产品推荐

