Python 浮点数转十进制转换
Python中的Decimal(十进制)类型不能直接从浮点数(float)创建;它要求你先把浮点数转换成字符串。
这就很麻烦,因为标准的字符串格式化方法在处理浮点数时,需要你指定小数位数,而不是有效数字的位数。所以,如果你有一个可能有15位小数的数字,你需要用Decimal("%.15f" % my_float)
来格式化,这样在第15位小数处如果前面还有有效数字,就会出现错误的结果(比如Decimal("%.15f" % 100000.3) == Decimal('100000.300000000002910')
)。
有没有人能推荐一个好的方法,把浮点数转换成Decimal,同时保留用户输入的值,也许可以限制有效数字的位数?
13 个回答
32
你在问题中提到:
有没有人能推荐一个好的方法,将浮点数转换为十进制,保持用户输入的值不变。
但是每次用户输入的值其实是以字符串的形式输入的,而不是浮点数。你在某个地方把它转换成了浮点数。直接把它转换成十进制,这样就不会丢失精度了。
36
我建议这样做
>>> a = 2.111111
>>> a
2.1111110000000002
>>> str(a)
'2.111111'
>>> decimal.Decimal(str(a))
Decimal('2.111111')
82
Python 2.7 之前的版本
"%.15g" % f
或者在 Python 3.0 中:
format(f, ".15g")
Python 2.7 及以上版本,3.2 及以上版本
只需直接把浮点数传给 Decimal
的构造函数,像这样:
from decimal import Decimal
Decimal(f)