[英]Dictionary record is truncated when printing
我有一个包含一些浮点值的字典。
当我按原样打印字典时,我会完全准确地打印这些值。
但是,当我尝试分别打印每个值时,它们被截断了。
一个简单的编码示例来说明问题:
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']
并以全精度打印d['x']
的值。
为什么 Python 解释器为d
和d['x']
选择不同的打印格式,我在这里可以采取什么方法来实现我的目的?
你看到的是与当什么是印刷的差异__str__
方法被调用的时候VS __repr__
被调用。
一个例子:
In [816]: print 0.010000000000000231
0.01
In [817]: print repr(0.010000000000000231)
0.010000000000000231
这种差异的原因是因为str
试图截断 python2 中的数字。
这在 python3 中发生了变化,并且str
和repr
表现一致。
当我按原样打印字典时,我会完全准确地打印这些值。
不,不是真的。 示例(注意不同的最后一位数字):
>>> 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 更有意义。
但是,当您打印字典或其他更大的结构时,这可能不会显示给最终用户,而更可能是开发人员希望将其作为调试输出。 而对于开发者来说,重要的是得到一个“准确”代表存储值的值,而不是一个美化的版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.