24位数字字符串转numpy float64出现表示错误,寻求可存储该大数的numpy数值类型
24位数字字符串转numpy float64出现表示错误,寻求可存储该大数的numpy数值类型
兄弟,你碰到的这个问题完全是浮点数的精度限制在搞鬼!先给你把原因说透:float64(也就是双精度浮点数)最多只能精确表示53位以内的二进制整数,换算成十进制的话,大概是16位左右的整数能完全精确对应。你的24位十进制数,转换成二进制的话大概有80位左右,远远超过了53位的精确范围,所以转成float64后必然会丢失精度,输出结果和原数不一样是板上钉钉的事儿。
那numpy里有没有能装下这个大数的数值类型?当然有,给你几个适配你场景的靠谱选择:
- np.int128 / np.uint128:这绝对是最适合你的方案。128位整数的范围大得离谱,
np.int128的最大正整数大概是1.7e38,完全能轻松容纳你的24位十进制数(1e24级别)。而且这是numpy的原生数值类型,运算效率拉满,还支持精确的相等判断——刚好完美契合你用这个ID做join、merge的核心需求,完全不需要搞什么ID映射,不会平白增加系统复杂度。如果你的ID全是正整数,用np.uint128(无符号128位整数)更合适,范围还能再翻一倍,安全性更高。 - np.object_类型存Python int:Python的int本身是任意精度的,你可以把这个ID列的dtype设为
np.object_,直接存Python的整数对象,这样也能精确表示原数。但缺点也很明显:numpy对object类型的运算、操作效率会比原生数值类型低不少,如果你处理的数据量很大,可能会拖慢程序速度。
另外给你提个实操小建议:从Postgres读取数据到pandas的时候,直接指定这个ID列的dtype为np.int128(或者对应的无符号类型),这样读进来的DataFrame列就是精确的数值类型,后续的merge操作和用普通整数列完全一样,不会有任何幺蛾子。
备注:内容来源于stack exchange,提问作者dgn
相关产品推荐
相关产品推荐

