Python Decimal模块精度设置疑问:为何精度设5却得到6位结果?
Decimal模块prec参数的误区与保留指定小数位数的方法
你混淆了getcontext().prec的作用——它控制的是有效数字的总位数,不是小数部分的位数。
你设置的prec=5,意味着计算结果会保留5个有效数字。来看你的计算结果:准确值是0.0120079335,有效数字是从第一个非零数字"1"开始数:1、2、0、0、7,第5位有效数字是7,后面跟着9,所以四舍五入后变成8,最终得到0.012008——这正好是5个有效数字(1、2、0、0、8),完全符合prec的设置逻辑。你之前误以为是保留5位小数,所以才会有预期偏差。
如果要始终保留5位小数,不要依赖prec,而是用Decimal的quantize()方法,明确指定小数位数的格式:
修改后的代码如下:
from decimal import Decimal, getcontext a = Decimal("80.05289") b = Decimal("0.00015") c = a * b # 指定保留5位小数,用Decimal('0.00001')作为格式模板 c_rounded = c.quantize(Decimal('0.00001')) print(c_rounded)
运行这段代码会输出0.01201,和你最初的预期一致。
如果需要全局统一设置小数的 rounding 规则,可以调整getcontext().rounding(比如设置为ROUND_HALF_UP),但quantize()是针对单个数值控制小数位数最直接的方式。
内容的提问来源于stack exchange,提问作者Vladislav Korecký
相关产品推荐
相关产品推荐

