为何Python Decimal模块设置精度为2却输出4位小数?
Decimal模块prec设置后未生效的原因及解决方法
问题核心
getcontext().prec = 2 设置的是有效数字的总位数,并非小数点后的小数位数,而且这个精度规则仅在执行算术运算时才会触发,直接将字符串转为Decimal对象不会自动截断精度。
你当前的代码只是将字符串"0.8727"转为Decimal实例,没有触发任何运算,因此会完整保留原始数值的所有位数。
解决方法
方法1:用算术运算触发精度截断
当对Decimal对象执行运算时,prec的精度规则会自动生效:
from decimal import Decimal, getcontext getcontext().prec = 2 a = Decimal("0.8727") # 执行无意义运算触发精度处理 a_truncated = a + Decimal(0) print(a_truncated) # 输出:0.87
方法2:用quantize()指定小数位数
如果需要精确控制小数点后的位数,quantize()是更直接的方式,还可指定舍入规则:
from decimal import Decimal, ROUND_HALF_UP # 指定保留2位小数,采用四舍五入规则 a = Decimal("0.8727").quantize(Decimal("0.00"), rounding=ROUND_HALF_UP) print(a) # 输出:0.87
关键区别
prec:全局设置,控制所有算术运算的有效数字总数,比如prec=2时,123.45会被处理为1.2e+2quantize():针对单个Decimal对象,精确控制小数点后的位数,适合金额、百分比等场景
内容的提问来源于stack exchange,提问作者Davide Farassino
相关产品推荐
相关产品推荐

