【问题标题】:Dictionary record is truncated when printing打印时字典记录被截断
【发布时间】:2018-01-29 13:05:07
【问题描述】:

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

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

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

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

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'] 选择不同的打印格式,我可以在这里采取什么方法来达到我的目的?

【问题讨论】:

标签: python python-2.7 dictionary floating-point


【解决方案1】:

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

一个例子:

In [816]: print 0.010000000000000231
0.01

In [817]: print repr(0.010000000000000231)
0.010000000000000231

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

这在 python3 中有所改变,strrepr 的行为一致。

【讨论】:

  • 太好了,那么用repr 封装每个print 会解决问题吗?
【解决方案2】:

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

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

>>> 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 更有意义。

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

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2014-05-22
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多