在Python的Decimal类中设置精度

7

我刚学习了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) - pavel_form
1个回答

7

一种做法是将prec设置得比实际需求高很多,然后使用round函数。Python 3:

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

For Python 2, do:

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

prec的值取决于你的数字有多大,但它必须大于log10的值,否则你将会得到一个decimal.InvalidOperation: quantize result has too many digits for current context的异常。


使用 round 函数将 Decimal 转换回内置浮点类型。 - Rontogiannis Aristofanis
我正在解决一个需要大浮点精度的问题。这就是为什么我必须使用Python的原因。现在,如果问题的答案是0.55,我应该打印0.55,然后是48个零... - Rontogiannis Aristofanis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接