【问题标题】:Setting precision in Decimal class Python在十进制类 Python 中设置精度
【发布时间】:2015-02-22 15:17:13
【问题描述】:

我刚刚学习了 Python 中的 Decimal 类,在修改十进制数的精度时遇到了一些问题。代码:

from decimal import *

def main() :
  getcontext().prec = 50
  print Decimal(748327402479023).sqrt()

if __name__ == '__main__' :
  main()

输出:

27355573.51764029457632865944595074348085555311409538
1.414213562373095048801688724209698078569671875376948

不是显示 50 位小数,而是总共显示 50 位。有没有办法解决这个问题?

编辑:

我正在解决一个需要高浮点精度的问题。这就是为什么我必须使用python。现在,如果问题的答案是例如 0.55,我应该打印 0.55,后跟 48 个零...

【问题讨论】:

  • 打印零使用字符串格式:print "{:.50f}".format(d)

标签: python floating-point decimal floating-point-precision floating


【解决方案1】:

一种方法是将prec 设置得比您需要的高得多,然后使用round。 Python 3:

>>> getcontext().prec=100
>>> print(round(Decimal(748327402479023).sqrt(), 50))
27355573.51764029457632865944595074348085555311409538175920
>>> print(round(Decimal(7483).sqrt(), 50))
86.50433515148243713481567854198645604944135142208905

对于 Python 2,请执行以下操作:

>>> print Decimal(748327402479023).sqrt().quantize(Decimal('1E-50'))
27355573.51764029457632865944595074348085555311409538175920

prec 的值取决于您的数字有多大,但它必须大于您的数字的 log<sub>10</sub>,否则您将收到 decimal.InvalidOperation: quantize result has too many digits for current context 异常。

【讨论】:

  • 使用 round 将 Decimal 转换回内置浮动类型
  • 我正在解决一个需要大浮点精度的问题。这就是为什么我必须使用python。现在如果问题的答案是 0.55,我应该打印 0.55 后跟 48 个零...
猜你喜欢
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多