python - 为什么Python 3字符串函数会降低 float 的精度?

标签 python floating-point precision

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

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

>>> print(3.140000000000000124344978758017532527446746826171875)

产量3.14。虽然

>>> print('3.140000000000000124344978758017532527446746826171875')

产量3.140000000000000124344978758017532527446746826171875

这是为什么呢?

注意;我不是问为什么 float 会失去精度,而是具体来说,为什么使用 str(n)'n' (引号)与 的行为不同打印()

最佳答案

在情况1和2中,您操作的是一个 float 对象

f = 3.140000000000000124344978758017532527446746826171875

# In case 1
print(str(f))

# In case 2
print(f)

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

在情况3中,你操作的是一个包含53个字符的字符串对象,

将浮点对象转换为字符串时发生了什么?

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

在函数float_repr中,如果没有指定精度参数,则float对象将被转换为 double 浮点格式的字符串。

double 浮点格式提供 15 到 17 位有效小数位精度。

因此,在本例中,有效十进制数字精度为 16,3.140000000000000124344978758017532527446746826171875 将转换为 3.140000000000000

一个更清晰的例子:

>>> str(3.140000000000000123)
'3.14'

>>> str(3.14000000000000123)
'3.140000000000001'

>>> print(3.14000000000000123)
3.140000000000001

关于python - 为什么Python 3字符串函数会降低 float 的精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53750099/

相关文章:

python - scrapy - 每个 starurl 单独的输出文件

python - 临时对象的内存消耗和生命周期

floating-point - 58.85显示为58.84999999999

c# - 为什么要使用这种笨拙的方式将 float 舍入为整数?

Lua小数精度损失

c++ - 如果两种语言都遵循 IEEE 754,那么两种语言的计算结果是否相同?

c++ - 使用 boost lib 的更高精度 float (高于 16 位数字)

python - 尝试卡住 python 应用程序时未找到 Google Protocol Buffer

python - 奇怪的 UTF-8 单行解释器错误

C - float 序列化( float 、 double )