Python 浮点数转十进制转换

94 投票
13 回答
156950 浏览
提问于 2025-04-11 20:37

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)

撰写回答