Skip to main content
 首页 » 编程设计

python之修复 *displaying* 在 python 中 float 时的精度问题

2025年05月04日15davidwang456

我正在使用 np.loadtxt 读出一个包含一些 float 的文本文件。这是我的 numpy 数组的样子:

x = np.loadtxt(t2) 
print(x) 
 
array([[  1.00000000e+00,   6.61560000e-13], 
       [  2.00000000e+00,   3.05350000e-13], 
       [  3.00000000e+00,   6.22240000e-13], 
       [  4.00000000e+00,   3.08850000e-13], 
       [  5.00000000e+00,   1.11170000e-10], 
       [  6.00000000e+00,   3.82440000e-11], 
       [  7.00000000e+00,   5.39160000e-11], 
       [  8.00000000e+00,   1.75910000e-11], 
       [  9.00000000e+00,   2.27330000e-10]]) 

我通过这样做将第一列与第二列分开:

idx, coeffs = zip(*x) 

现在,我想创建一个 id : coeff 的映射,像这样:

mapping = dict(zip(map(int, idx), coeffs)) 
print(mapping) 
 
{1: 6.6155999999999996e-13, 
 2: 3.0535000000000001e-13, 
 3: 6.2223999999999998e-13, 
 4: 3.0884999999999999e-13, 
 5: 1.1117e-10, 
 6: 3.8243999999999997e-11, 
 7: 5.3915999999999998e-11, 
 8: 1.7591e-11, 
 9: 2.2733e-10} 

如您所见,引入了精度误差。例如,6.61560000e-13 变成了 6.6155999999999996e-13。

这就是我想要的,最好是:

{1: 6.61560000e-13, 
 2: 3.05350000e-13, 
 3: 6.22240000e-13, 
 4: 3.08850000e-13, 
 ... 
 } 

我该怎么做?如果有帮助的话,我正在研究 IPython3。

请您参考如下方法:

Jean-François Fabre's comment 给了我一个想法,我试了一下。考虑到亚历山大关于使用听写理解的建议,这对我有用:

x = np.loadtxt(t2) 
mapping = {int(k) : v for k, v in x.tolist()} 
 
print (mapping) 

输出:

{1: 6.6156e-13, 
 2: 3.0535e-13, 
 3: 6.2224e-13, 
 4: 3.0885e-13, 
 5: 1.1117e-10, 
 6: 3.8244e-11, 
 7: 5.3916e-11, 
 8: 1.7591e-11, 
 9: 2.2733e-10} 

之所以可行,是因为 x 是 np.float64 类型。调用 .tolist() 将 x 转换为列表的列表,其中每个元素的类型都是 double. np.float64 和 double 有不同的 __repr__ 实现。 double 使用 David Gay Algorithm 来正确表示这些 float ,而 numpy 的实现要简单得多(只是截断)。