Python Decimal库精度异常求助:设3位小数却输出33.0
解决Python Decimal库精度设置导致的结果异常问题
问题出在getcontext().prec的作用是控制有效数字的位数,不是你以为的小数位数。当你把prec设为3时,Decimal会把运算结果保留3位有效数字:32.983有5位有效数字,运算后会被四舍五入成3位,也就是33.0(3、3、0这三位有效数字)。
要得到你想要的32.983,有两种靠谱的解决方法:
方法一:用quantize()指定固定小数位数
这是最适合固定小数位数场景的方法,直接针对结果设置保留的小数位数,不受全局有效数字设置的影响:
from decimal import Decimal, ROUND_HALF_UP # 先完成运算 result = Decimal('32.983') - Decimal('0.000') # 指定保留3位小数,ROUND_HALF_UP是常用的四舍五入模式,可按需替换 rounded_result = result.quantize(Decimal('0.000'), rounding=ROUND_HALF_UP) print(rounded_result) # 输出 Decimal('32.983')
方法二:调整全局有效数字位数
如果你需要全局设置,得把prec设为足够容纳整个数值的有效数字位数。比如32.983有5位有效数字,把prec设为5就行:
from decimal import getcontext, Decimal getcontext().prec = 5 result = Decimal('32.983') - Decimal('0.000') print(result) # 输出 Decimal('32.983')
注意:全局prec会影响所有Decimal运算,如果你处理的数值位数不固定,还是用quantize()更灵活。
内容的提问来源于stack exchange,提问作者João Gabriel Paina
相关产品推荐
相关产品推荐

