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
相关产品推荐
相关产品推荐

