Python Decimal转换中溢出与下溢问题的处理方案
问题解决与需求实现
1. 先解决报错问题
报错NameError: name 'decimal' is not defined是因为你直接导入了Overflow、Underflow等异常类,捕获时却用了decimal.Overflow的写法——你并没有导入decimal模块本身,只导入了模块内的成员,直接使用导入的异常类即可。
2. 实现指数限制需求
- 当输入数值的指数≥100时,返回对应符号的最大允许值(1e+99或-1e+99)
- 当输入数值的指数≤-100时,返回"0"
- 正常范围内的数值转换为Decimal字符串返回
修改后的完整代码
from decimal import (Clamped, Context, Decimal, Inexact, Overflow, Rounded, Underflow) def format_number(value): # 参数配置:指数范围 [-99, 99],精度30 MAX_EXPONENT = 99 DYNAMODB_CONTEXT = Context(Emin=-99, Emax=99, prec=30, traps=[Clamped, Overflow, Underflow]) try: number_decimal = DYNAMODB_CONTEXT.create_decimal(value) number_str = str(number_decimal) # 处理特殊值 if number_str in ['-Infinity', 'Infinity', 'NaN']: print('Infinity and NaN not supported') return False return number_str except Overflow: # 处理溢出:返回对应符号的最大允许值 if value > 0: return str(DYNAMODB_CONTEXT.create_decimal(f"1e{MAX_EXPONENT}")) else: return str(DYNAMODB_CONTEXT.create_decimal(f"-1e{MAX_EXPONENT}")) except Underflow: # 处理下溢:视为0 return "0" # 测试用例 print(format_number(-1e-322)) # 输出 0 print(format_number(1e-322)) # 输出 0 print(format_number(-1e322)) # 输出 -1E+99 print(format_number(1e322)) # 输出 1E+99
代码说明
- 修正了异常捕获的写法,直接使用导入的
Overflow、Underflow类,解决NameError - 溢出时根据输入数值的符号,返回最大/最小的合法Decimal字符串
- 下溢时直接返回"0",符合需求
- 修正了
return(false)的错误写法,改为return False(Python布尔值不需要括号) - 拆分了Decimal对象和字符串的转换,逻辑更清晰
内容的提问来源于stack exchange,提问作者Medical physicist
相关产品推荐
相关产品推荐

