字典记录在打印时被截断

时间:2017-08-21 12:39:51

标签: python python-2.7 dictionary floating-point

我有一个包含一些浮点值的字典。

当我按原样打印字典时,我会完全准确地打印这些值。

但是,当我尝试单独打印每个值时,我会将它们截断。

一个简单的编码示例来说明问题:

https://www.google.com/maps/dir/?api=1&origin=18.518205,73.857431&destination=18.518205,73.857431&waypoints=18.518205,73.857431%7C18.552248,73.901596%7C18.629764,73.934685

现在,我当然可以使用d = {'x': 0.010000000000000231} print d # outputs {'x': 0.010000000000000231} print d['x'] # outputs 0.01 来解决这个问题,例如,在上面的示例中:

format

但是,我希望避免这种解决方案。

首先,因为我不知道字典中每个条目所需的精确精度。其次,因为我更喜欢避免繁琐的编码类型,这涉及到指定每个字段的打印格式。

换句话说,我想做一些事情:

print '{:.18f}'.format(d['x']) # outputs 0.010000000000000231

或者:

print 'x = {}'.format(d['x'])

以完全精确的方式打印print 'x =',d['x'] 的值。

为什么Python解释器会为d['x']d选择不同的打印格式,为了实现我的目的,我可以采取什么方法?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

您所看到的是调用__str__方法与调用__repr__时打印的内容之间的差异。

一个例子:

In [816]: print 0.010000000000000231
0.01

In [817]: print repr(0.010000000000000231)
0.010000000000000231

造成这种差异的原因是因为str试图截断python2中的数字。

在python3中进行了更改,strrepr的行为一致。

答案 1 :(得分:1)

  

当我按原样打印字典时,我会完全准确地打印这些值。

不,不是真的。示例(注意不同的最后一位数字):

>>> d = {'x': 0.010000000000000232}
>>> print d
{'x': 0.010000000000000233}

d['x']的实际完全准确度都不是:

>>> print ('%.2000f' % d['x']).rstrip('0')
0.01000000000000023266111259800936750252731144428253173828125

打印字典时获得的是repr字符串。只打印浮点数时得到的是str字符串:

>>> print d['x']
0.01
>>> print str(d['x'])
0.01
>>> print repr(d['x'])
0.010000000000000233

如果您想要与字典打印中的输出相同,请使用repr

我认为原因是当你打印一个数字时,很可能会向最终用户显示。实际上像0.010000000000000231这样的值(即,不像你那样人为输入)更可能是计算机计算不精确的结果,真正的值实际上是0.01。就像你用美元计算价格一样,0.01意味着1美分。因此,向最终用户显示而不是0.010000000000000231更有意义。

但是当你打印字典或其他更大的结构时,可能显示给最终用户,但更有可能是开发人员想要它作为调试输出。对于开发人员来说,获得一个“准确”代表存储值的值非常重要,而不是一个美化版本。