繁体   English   中英

打印时字典记录被截断

[英]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 解释器为dd['x']选择不同的打印格式,我在这里可以采取什么方法来实现我的目的?

你看到的是与当什么是印刷的差异__str__方法被调用的时候VS __repr__被调用。

一个例子:

In [816]: print 0.010000000000000231
0.01

In [817]: print repr(0.010000000000000231)
0.010000000000000231

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

这在 python3 中发生了变化,并且strrepr表现一致。

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

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

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM