将float
转换为str
时,我可以指定要显示的小数点数
'%.6f' % 0.1
> '0.100000'
'%.6f' % .12345678901234567890
> '0.123457'
但是当在python 2.7中仅在str
上调用float
时,它似乎默认为最大12个小数点
str(0.1)
>'0.1'
str(.12345678901234567890)
>'0.123456789012'
最大的小数点定义/记录在哪里?我可以通过编程方式获得该号码吗?
答案 0 :(得分:5)
显示的小数位数将有很大的不同,并且没有一种方法可以预测纯Python中显示的小数位数。诸如.do({
next: () => {
inProgress = true;
this.logger.info('Exporting in progress...');
},
complete: () => {
inProgress = false;
this.logger.info('Download file finished...');
}
})
之类的某些库允许您设置输出的精度。
这仅仅是因为limitations of float representation。
链接的相关部分讨论了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。
答案 1 :(得分:3)
我认为这在python语言规范中不存在。但是,cpython实现确实指定了它。 float_repr()
函数将浮点数转换为字符串,最终使用'r'
格式化程序调用了一个辅助函数,后者最终调用了一个实用程序函数,该函数将格式硬编码为format(float, '.16g')
。可以看到该代码here。请注意,这是针对python3.6的。
>>> import math
>>> str(math.pi*4)
12.5663706144
给出最大位数(在小数点前后)在16。看来在python2.7实现中,此值被硬编码为.12g
。至于发生这种情况的原因(并且here可以找到,但缺少文档)。
因此,如果您尝试获取数字在打印时要格式化的时间,只需使用.12g
来获取其长度。
def len_when_displayed(n):
return len(format(n, '.12g'))
答案 2 :(得分:3)
好吧,如果您正在寻找一种完成此操作的纯python方法,则可以始终使用类似的方法
len(str(.12345678901234567890).split('.')[1])
>>>> 12
我在文档中找不到它,如果可以的话,会在这里添加它,但这是一种变通方法,如果您想事先知道,它至少总是可以返回精度的长度。
如您所说,即使输入更大的浮点数,它似乎总是12
。
根据我的发现,这个数字可能有很大的差异,在这种情况下,凭经验找到它似乎是最可靠的方法。所以,我要做的就是定义一个像这样的简单方法,
def max_floating_point():
counter = 0
current_length = 0
str_rep = '.1'
while(counter <= current_length):
str_rep += '1'
current_length = len(str(float(str_rep)).split('.')[1])
counter += 1
return current_length
这将返回您在当前系统上的最大长度表示,
print max_floating_point()
>>>> 12
答案 3 :(得分:0)
通过查看转换后的随机数的输出,我无法理解如何确定str()
的长度,例如在Python 3.6.6下:
>>> str(.123456789123456789123456789)
'0.12345678912345678'
>>> str(.111111111111111111111111111)
'0.1111111111111111'
您可以选择此代码来模拟您的实际情况:
import random
maxdec=max(map(lambda x:len(str(x)),filter(lambda x:x>.1,[random.random() for i in range(99)])))-2
这里,我们正在转换后在(.1,1)打开间隔中测试〜90个随机数的长度(并从左侧推论0.
,因此推论-2
)。
64位Linux上的Python 2.7.5给我12,Python 3.4.8和3.6.6给我17。