将float转换为str时,如何检查默认的小数精度?

C_Z*_*_Z_ 21 python string floating-point

将a转换float为a时str,我可以指定要显示的小数点数

'%.6f' % 0.1
> '0.100000'
'%.6f' % .12345678901234567890
> '0.123457'
Run Code Online (Sandbox Code Playgroud)

但是,当简单地调用str一个float在Python 2.7,它似乎默认为12小数点最多

str(0.1)
>'0.1'
str(.12345678901234567890)
>'0.123456789012'
Run Code Online (Sandbox Code Playgroud)

这个最大小数点数定义/记录在哪里?我能以编程方式获取此号码吗?

use*_*203 5

显示的小数位数差异很大,并且无法预测纯Python中显示的小数位数.有些库numpy允许您设置输出的精度.

这仅仅是因为浮点表示局限性.

该链接的相关部分讨论了Python如何选择显示浮点数.

Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值

Python通过显示舍入值来保持可管理的位数

现在,这里有可能重叠:

有趣的是,有许多不同的十进制数,它们具有相同的最接近的近似二进制分数

用于选择要显示的十进制值的方法在Python 3.1中已更改(但最后一句意味着这可能是一个实现细节).

例如,数字0.1和0.10000000000000001都近似为3602879701896397/2**55.由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变eval(repr(x))= = x

从历史上看,Python提示符和内置的repr()函数将选择具有17位有效数字的0.10000000000000001.从Python 3.1开始,Python(在大多数系统上)现在能够选择最短的这些并且只显示0.1.

  • 嗯,"Python只打印机器存储的二进制_approximation_的真实十进制值的十进制近似值"似乎不对.二进制浮点数中的值我称之为精确,而不是二进制_approximation_."...到机器存储的二进制的真正十进制值"听起来更清晰.浮点的分配方式可能会产生一些舍入,但存储值本身就是精确的. (5认同)