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

Python CRT计算结果转十六进制报错'float'对象无法解释为整数如何解决

问题根因
  • 触发报错的核心原因是Python 3中/运算符返回浮点数类型:代码中chinese_remainder函数内N = modulus / N_i使用了普通除法,即便modulus是N_i的整数倍,返回结果也是float类型,后续所有运算自动升级为浮点数,数值超过浮点数精确表达范围后就会出现精度丢失,变成科学计数法格式。
  • hex()函数仅支持整数类型作为入参,传入浮点数就会触发TypeError: 'float' object cannot be interpreted as an integer报错。
修复方案

仅需要修改两处即可得到正确结果:

  1. 将chinese_remainder函数中的普通除法/替换为整数除法//,保证全程运算都是整数类型,无精度损失
  2. 如果需要输出无0x前缀的大写十六进制结果,可以对hex()的返回值做简单处理
修改后的完整代码
import functools

# Euclidean extended algorithm
def egcd(a, b):
    if a == 0:
        return b, 0, 1
    else:
        d, x, y = egcd(b % a, a)
        return d, y - (b // a) * x, x

"""
    Functions whcih calculate the CRT (
    return x in ' x = a mod n'.
"""

def chinese_remainder(a, n):
    modulus = functools.reduce(lambda a, b: a * b, n)
    multipliers = []
    for N_i in n:
        # 替换为整数除法
        N = modulus // N_i
        gcd, inverse, y = egcd(N, N_i)
        multipliers.append(inverse * N % modulus)

    result = 0
    for multi, a_i in zip(multipliers, a):
        result = (result + multi * a_i) % modulus
    return result

FN = 1184749
FM = 8118474
FL = 5386565
HN = 8686891
HM = 6036033
HK = 6029230

n = [FN, FM, FL]
a = [HN, HM, HK]

d = chinese_remainder(a, n)
# 去掉0x前缀并转为大写,符合预期输出格式
number = hex(d).lstrip('0x').upper()
print(number)
输出结果

运行后输出为:
FAB15A7AE056200F9
和预期结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:54:05