python中精度问题怎么办_修复*显示*在Python中浮动时的精度问题

I'm reading out a text file with some float numbers using np.loadtxt . This is what my numpy array looks like:

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]])

I separate out the first column from the second by doing this:

idx, coeffs = zip(*x)

Now, I want to create a mapping of id : coeff, something like this:

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}

As you can see, precision errors have been introduced. For example, 6.61560000e-13 became 6.6155999999999996e-13.

This is what I would like, preferrably:

{1: 6.61560000e-13,

2: 3.05350000e-13,

3: 6.22240000e-13,

4: 3.08850000e-13,

...

}

How can I do this? I am working on IPython3, if that helps.

解决方案

Jean-François Fabre's comment gave me an idea, and I tried it out. Taking into consideration Alexander's suggestion to use a dict comprehension, this worked for me:

x = np.loadtxt(t2)

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

print (mapping)

Output:

{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}

The reason this works is because x is of type np.float64. Calling .tolist() converts x to a list of lists, where each element is of type double. np.float64 and double have different __repr__ implementations. The double uses the David Gay Algorithm to correctly represent these floats, while numpy has a much simpler implementation (mere truncation).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值