64位整数转十六进制结果不符,求原因及Modbus场景解决方法
问题分析与解决
差异原因
问题出在int(int_val / 256)这行代码:
Python 3中/是浮点数除法,而双精度浮点数(Python的float类型)仅能精确表示253以内的整数。你的原始整数`6074967776560871829`远大于253(约9×10¹⁵),转换为浮点数时会丢失精度,导致除法后的结果不准确,最终使得第二个字节的计算出现偏差(本该是0xf9,却因精度丢失变成0xf8)。
修改方案
将浮点数除法替换为整数除法运算符//,它直接对整数执行整除操作,不会涉及浮点数转换,能完整保留大整数的精度:
修改后的代码:
int_val = 6074967776560871829 hex_val = [] for i in range(0,8): hex_val.append(hex(int_val % 256)) int_val = int_val // 256 # 用整数除法替代浮点数除法 print(hex_val)
运行后会得到预期结果:
['0x95', '0xf9', '0xda', '0x97', '0x1', '0x9f', '0x4e', '0x54']
更简洁的实现方式
也可以利用Python内置的int.to_bytes方法直接完成转换,代码更简洁且不易出错(byteorder='little'对应你代码中的小端序,低位字节在前):
int_val = 6074967776560871829 bytes_val = int_val.to_bytes(8, byteorder='little') hex_val = [hex(b) for b in bytes_val] print(hex_val)
内容的提问来源于stack exchange,提问作者Nav
相关产品推荐
相关产品推荐

