为什么Python 3字符串函数似乎降低了float的精度?

时间:2018-12-12 19:29:58

标签: python

在Ubuntu 18上的Python(3.6.7)交互式shell中,两者都

>>> n = str(3.140000000000000124344978758017532527446746826171875)
>>> print(n)

>>> print(3.140000000000000124344978758017532527446746826171875)

产量3.14。虽然

>>> print('3.140000000000000124344978758017532527446746826171875')

收益3.140000000000000124344978758017532527446746826171875

这是为什么?

注意;我不是在问为什么浮点数会失去精度,而是要问为什么str(n)'n'(引号)的使用与print()会有不同的表现。

1 个答案:

答案 0 :(得分:1)

在情况1和2中,您操纵的是一个浮点对象

f = 3.140000000000000124344978758017532527446746826171875

# In case 1
print(str(f))

# In case 2
print(f)

str(f)将float对象转换为字符串,print(f)表示print(repr(f))repr(f)还将float对象转换为字符串。

在情况3中,您要处理的是一个包含53个字符的字符串对象

将float对象转换为字符串时会发生什么?

str(f)repr(f)调用相同的函数float_repr

在函数float_repr中,如果您未指定precision参数,则float对象将转换为具有双精度浮点格式的字符串。

双精度浮点格式可提供15到17个有效的十进制数字精度。

因此,在这种情况下,有效的十进制数字精度为16,3.140000000000000124344978758017532527446746826171875将转换为3.140000000000000

一个更清晰的例子:

>>> str(3.14000000000000123)
'3.140000000000001'

>>> print(3.14000000000000123)
3.140000000000001