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

Python Humanize处理古戈尔以上数字失效问题排查

问题分析与解决

问题根源

这是Humanize库intword函数的设计缺陷导致的,和你的代码无关。

humanize.intword内部会把传入的整数转换为浮点数进行计算,但浮点数(Python的float为双精度)的精度有限,无法精确表示像1古戈尔(10³⁰)这么大的整数。当你传入10³⁰时,它会被转成浮点数后丢失精度,函数内部计算逻辑错误将其判定为0,最终输出"0 googol";更大的数则会因浮点数精度溢出,得到错误的量级描述。

验证测试

你可以单独运行以下代码确认问题:

import humanize
print(humanize.intword(10**30))  # 输出 0 googol
print(humanize.intword(10**31))  # 输出错误的量级描述

解决方案

既然intword不支持超大整数,你可以自己实现基于整数运算的大数格式化逻辑,彻底避免浮点数精度问题:

def humanize_large_num(num):
    # 定义量级名称与对应指数(每3位一个量级,从千到古戈尔)
    magnitudes = [
        (10**30, 'googol'),
        (10**27, 'octillion'),
        (10**24, 'septillion'),
        (10**21, 'sextillion'),
        (10**18, 'quintillion'),
        (10**15, 'quadrillion'),
        (10**12, 'trillion'),
        (10**9, 'billion'),
        (10**6, 'million'),
        (10**3, 'thousand'),
    ]
    
    if num == 0:
        return '0'
    
    for mag, name in magnitudes:
        if num >= mag:
            count = num // mag
            remainder = num % mag
            if remainder == 0:
                return f"{count} {name}"
            else:
                # 可选:保留一位小数,按需调整
                return f"{count}.{str(remainder)[:1]} {name}"
    return str(num)

测试示例:

print(humanize_large_num(10**30))  # 输出 1 googol
print(humanize_large_num(5*10**30 + 3*10**29))  # 输出 5.3 googol

把这个函数替换你原有的humanizing函数,就能正确处理超大整数了。

内容的提问来源于stack exchange,提问作者Navis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:20:41