Julia使用UInt128数据类型时大整数除法错误问题咨询
Julia UInt128整数除法结果错误的原因说明
核心原理
该问题本质是运算符使用错误,和UInt128本身的运算精度无关:
- Julia中
/运算符对所有整数输入的默认返回类型为浮点数,而非整数。你测试的数值远超过Float64的精确整数表示范围(仅支持≤2^53的整数无精度丢失,约对应16位十进制有效数字),运算时会先将UInt128值转换为Float64,这一步已经出现了精度舍入,后续你再将结果转回UInt128,自然会得到误差值,和你观测到的“误差位置和Float64舍入位置一致”的现象完全匹配。 - 你输出的
g2类型为Float64也直接印证了该逻辑:UInt128 / UInt128的原生返回值就是Float64,手动标注返回类型为UInt128只是强制对已经丢失精度的浮点数做了类型转换,并不会修正前置的精度损失。
正确整数除法用法
执行整数除法请使用div()函数或者÷运算符(输入\div后按Tab即可打出),这两个运算会直接在整数类型上完成计算,不会转换为浮点数,不存在精度丢失问题。
修正后运算示例:
xu::UInt128 = parse(UInt128,"40282366920938463463374607431768211456") uu::UInt128 = 2 # 整数除法写法1 gu1 = div(xu, uu) # 整数除法写法2 gu2 = xu ÷ uu println(gu1) # 输出和BigInt运算一致的正确结果:20141183460469231731687303715884105728
问题触发场景
只要同时满足以下两个条件就会出现该类精度误差:
- 参与
/运算的整数值大于2^53,超出Float64的精确整数表示范围 - 将
/返回的浮点数结果强制转换回整数类型使用
内容的提问来源于stack exchange,提问作者Stephen Miller
相关产品推荐
相关产品推荐

