Python十进制数转字符串

50

这里有很多关于如何将字符串转换为小数的主题,但是我该如何将小数转换回字符串?

比如说,如果我做了这个:

import decimal
dec = decimal.Decimal('10.0')

如何将dec转换为字符串'10.0'


5
在发布此类问题之前,请参考API文档。您也可以直接使用Python并尝试自己的想法,这样通常效果不错。 - Marcin
5个回答

74

使用str()内置函数,它:

返回一个包含对象可打印表示的字符串。

例如:

>>> import decimal
>>> dec = decimal.Decimal('10.0')
>>> str(dec)
'10.0'

7
需要注意的是,在Python中,str() 函数几乎可以用于任何类型的数据。 - Greg Hewgill
1
@Greg,这就是应该的 :) - John La Rooy
因为大多数类型都实现了__str__方法。 - zinking
12
这部分是正确的,但对于像0.0000000000000123123这样的十进制字符串来说会失败,并且会打印出1.23123E-14。@Matthew 是正确的(在下面的答案中),他使用了字符串格式化函数。 - Saikiran Yerram
2
@SaikiranYerram 这取决于您是否认为这是该数字的合理表示。不清楚 OP 中的用例是什么,但确实,如果用户不想要该表示法,则字符串格式化方法将产生更好的结果。 - Gareth Latty
@SaikiranYerram 我不明白你为什么将指数表示输出定义为“失败”,这可能确实是期望的输出。 - eraoul

47
使用字符串格式化函数:
>>> from decimal import Decimal
>>> d = Decimal("0.0000000000000123123")
>>> s = '{0:f}'.format(d)
>>> print(s)
0.0000000000000123123

如果你只是将数字强制转换为字符串,对指数不起作用:

>>> str(d)
'1.23123E-14' 

2
我在输出中没有看到E符号有任何问题。 - eraoul
5
两种方式都是有效的,取决于使用情况(例如,您可能需要将该值发送到不接受E记数法的外部API)。如果只是用于打印/记录,那么我想这只是个人偏好问题。 - Jure Cerjak
科学记数法在你试图将大数与你所知道的“真实数学”进行比较时,具有讽刺意味,完全无用。你需要看到所有的数字,而不是“数量级是多少”。 - Mike 'Pomax' Kamermans

9
注意,使用%f字符串格式化似乎会先转换为浮点数(或只输出有限的小数位数),因此会损失精度。您应该使用%sstr()来显示存储在Decimal中的完整值。
给定:
from decimal import Decimal
foo = Decimal("23380.06198573179271708683473")
print("{0:f}".format(foo))
print("%s" % foo)
print("%f" % foo)

输出:

23380.06198573179271708683473
23380.06198573179271708683473
23380.061986

(编辑:根据@Mark的评论进行了更新。)


4
您说得对,应该避免使用基于%f的格式化,但我没有看到任何答案建议使用这种方法。请注意,format(foo, 'f')"{0:f}".format(foo) 不会将 foo 转换为浮点数或失去精度。 - Mark Dickinson

4
几乎所有内置的函数都像你预期的那样在Decimal类上工作:
>>> import decimal
>>> dec=decimal.Decimal('10.0')

一个字符串:

>>> str(dec)
'10.0'

浮动:

>>> float(dec)
10.0

一个整数:

>>> int(dec)
10

对象表示(就像在交互式解释器中一样):

>>> repr(dec)
"Decimal('10.0')"

有理数:

>>> import fractions
>>> fractions.Fraction(decimal.Decimal('0.50'))
Fraction(1, 2)

3
import decimal
dec = decimal.Decimal('10.0')
string_dec = str(dec)

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