【问题标题】:Python decimal module not being consistentPython十进制模块不一致
【发布时间】:2013-09-04 14:18:16
【问题描述】:

在我的 python 代码中,我使用了十进制模块,因为我需要非常高的精度。

我有变量 abc,其中 c = a强> / b

我让 python 打印出以下内容:

print "a: %.50f:" % (a),type(a)
print "b: %.50f:" % (b),type(b)
print "c: %.50f:" % (c),type(c)

哪个产生了。

a: 0.00000006480000292147666645492911155490567409742653: <class 'decimal.Decimal'>
b: 43200001.94765111058950424194335937500000000000000000000000 <class 'decimal.Decimal'>
c: 0.00000000000000149999999999999991934287350973866750 <class 'decimal.Decimal'>

这一切都很好,但是为了检查 c 的值,我进入 Python 的交互模式并直接复制并粘贴了这些数字:

a = decimal.Decimal('0.00000006480000292147666645492911155490567409742653')
b = decimal.Decimal('43200001.94765111058950424194335937500000000000000000000000')

当我要求 a / b 时,我得到:

Decimal('1.500000000000000013210016734E-15')

这是一个略有不同的结果!我知道浮点问题可能会导致像这样的小不精确,但这就是我一直使用十进制模块的原因。

谁能告诉我这两个答案的差异来自哪里?

【问题讨论】:

  • 您使用的上下文是什么(精度位数?)?
  • 我真的不知道你所说的上下文是什么意思。我正在做一个模拟作为我科学研究的一部分,这需要高精度。如果这不能回答您的问题,我们深表歉意。
  • decimal 模块允许您使用decimal.setcontext() 函数修改数字的精度。您是否使用它来修改默认精度?如果是,您使用的预置是什么?

标签: python decimal


【解决方案1】:

当您使用字符串格式(使用print "a: %.50f:" % (a),type(a))打印值时,您会隐式地将它们转换为浮点数!

你应该依赖小数的打印功能,即从它请求一个字符串:

print "a: %s:" % (a, type(a))
print "b: %s:" % (b, type(b))
print "c: %s:" % (c, type(c))

【讨论】:

  • 很公平。它是隐含的,它可能对每个人都不是显而易见的。
【解决方案2】:

使用format 方法而不是% 来格式化您的Decimal 值:

>>> c = Decimal('1.500000000000000013210016734E-15')
>>> print "c: %.50f" % c    # incorrect, conversion to float
c: 0.00000000000000149999999999999991934287350973866750
>>> print "c: {:.50f}".format(c)    # correct, no conversion
c: 0.00000000000000150000000000000001321001673400000000

如您所见,错误源于使用% 格式化将c 隐式转换为浮点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2017-02-24
    • 2021-07-03
    相关资源
    最近更新 更多