不幸的是,似乎甚至没有浮动.__格式的新式格式支持这个。 float的默认格式与repr相同;和f标志默认有6个小数位数:
>>> format(0.0000000005, 'f')
'0.000000'
然而,有一个hack获得所需的结果 – 不是最快的,但相对简单:
>首先使用str()或repr()将float转换为字符串,
>然后从该字符串创建一个新的Decimal实例。
> Decimal .__ format__支持f标志,它给出所需的结果,并且与float不同,它打印实际精度而不是默认精度。
因此我们可以创建一个简单的效用函数float_to_str:
import decimal
# create a new context for this task
ctx = decimal.Context()
# 20 digits should be enough for everyone :D
ctx.prec = 20
def float_to_str(f):
"""
Convert the given float to a string,
without resorting to scientific notation
"""
d1 = ctx.create_decimal(repr(f))
return format(d1, 'f')
必须小心不要使用全局十进制上下文,因此为此函数构造一个新的上下文。这是最快的方式;另一种方法是使用decimal.local_context,但它会更慢,为每个转换创建一个新的线程本地上下文和上下文管理器。
>>> float_to_str(0.1)
'0.1'
>>> float_to_str(0.00000005)
'0.00000005'
>>> float_to_str(420000000000000000.0)
'420000000000000000'
>>> float_to_str(0.000000000123123123123123123123)
'0.00000000012312312312312313'
最后一个结果在最后一位数字四舍五入
正如@Karin所指出的,float_to_str(420000000000000000.0)并不与预期的格式严格匹配;它返回420000000000000000没有尾.0。