我有一个包含一些浮点值的字典。
当我按原样打印字典时,我会完全准确地打印这些值。
但是,当我尝试单独打印每个值时,我会将它们截断。
一个简单的编码示例来说明问题:
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
选择不同的打印格式,为了实现我的目的,我可以采取什么方法?
非常感谢你的帮助。
答案 0 :(得分:3)
您所看到的是调用__str__
方法与调用__repr__
时打印的内容之间的差异。
一个例子:
In [816]: print 0.010000000000000231
0.01
In [817]: print repr(0.010000000000000231)
0.010000000000000231
造成这种差异的原因是因为str
试图截断python2中的数字。
在python3中进行了更改,str
和repr
的行为一致。
答案 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更有意义。
但是当你打印字典或其他更大的结构时,可能不显示给最终用户,但更有可能是开发人员想要它作为调试输出。对于开发人员来说,获得一个“准确”代表存储值的值非常重要,而不是一个美化版本。