python中有没有办法将小数部分截断为5位或7位?
如果没有,我怎样才能避免像 e**(-x) 数字这样的浮点数变得太大?
谢谢
要么抓住OverflowError
或使用decimal
模块。Python 不会假设你对溢出没问题。
>>> 0.0000000000000000000000000000000000000000000000000000000000000001**-30
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
>>> d = decimal.Decimal(0.0000000000000000000000000000000000000000000000000000000000000001)
>>> d**-30
Decimal('1.000000000000001040827834994E+1920')
“结果太大”并不是指数字的十进制表示中的字符数,这意味着由指数函数产生的数字足够大,足以溢出python内部用于存储浮点值的任何类型。
您需要使用不同的类型来处理浮点计算,或者重新编写代码以使 e**(-x) 不会上溢或下溢。
这似乎有效
from decimal import *
getcontext().prec = 7
math.exp(- Decimal(x))