在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()
会有不同的表现。
答案 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个字符的字符串对象
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