You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:23:33