为何Python中round(x, 0)与round(x)结果不等?Decimal舍入疑问
Decimal舍入行为差异解析
1. round(a)与round(a, 0)的行为差异
Python的round()函数对Decimal实例的处理逻辑分两种场景:
- 当指定第二个参数(如
round(a, 0))时,会调用Decimal对象自身的舍入逻辑,完全遵循decimal.getcontext()中设置的舍入模式(ROUND_HALF_DOWN/ROUND_HALF_UP),所以结果符合你的预期。 - 当不指定第二个参数(即
round(a))时,会触发Python内置的通用round()逻辑:它先把Decimal转换为float类型,再对float执行舍入。而float的舍入默认采用ROUND_HALF_EVEN(银行家舍入),和Decimal上下文的设置无关。对于1.5这个值,float舍入到整数的结果是2,所以你看到了"向上舍入"的表现,这和Decimal的舍入模式没有关系。
2. round(a)不返回Decimal类型的原因
无参round()的处理流程决定了结果类型:它将Decimal转换为float处理后,最终返回int类型(当舍入到整数时)。如果想要得到Decimal类型的整数结果,必须使用带参数的round(a, 0),或者直接调用Decimal的to_integral_value()方法,比如:
a.to_integral_value(rounding=decimal.ROUND_HALF_DOWN)
验证代码示例
补充逻辑后的代码更清晰展示差异:
import decimal a: decimal.Decimal = decimal.Decimal('1.5') decimal.getcontext().rounding = decimal.ROUND_HALF_DOWN print(f'{decimal.getcontext()=}') print(f'{a=}, {round(a, 0)=}') # 输出: a=Decimal('1.5'), round(a, 0)=Decimal('1') print(f'{a=}, {round(a)=}, 类型: {type(round(a))}') # 输出: a=Decimal('1.5'), round(a)=2, 类型: <class 'int'> decimal.getcontext().rounding = decimal.ROUND_HALF_UP print(f'{decimal.getcontext()=}') print(f'{a=}, {round(a, 0)=}') # 输出: a=Decimal('1.5'), round(a, 0)=Decimal('2') print(f'{a=}, {round(a)=}, 类型: {type(round(a))}') # 输出: a=Decimal('1.5'), round(a)=2, 类型: <class 'int'>
内容的提问来源于stack exchange,提问作者user2567544
相关产品推荐
相关产品推荐

