将float转换为str时如何检查默认的十进制精度?

时间:2018-08-07 13:56:07

标签: python string floating-point

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'

最大的小数点定义/记录在哪里?我可以通过编程方式获得该号码吗?

4 个答案:

答案 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。