Python 求浮点精度

Python 求浮点精度,python,floating-point,Python,Floating Point,在python中,给定数字2.056e+07和2.05645e+07,如何查找每个数字的有效数字?也就是尾数的长度。目的是比较数据输入的数字,只选择信息最多的数字 这些信息不知何故隐藏在(也许是) 使用'2.05645e+07'。索引('e')似乎是一种黑客行为。稍微不那么黑客,但仍然可以改进: len(''.join([str(x) for x in Decimal(2.05645e+07).as_tuple().digits]).rstrip('0')) 用支票更易读一点 为什么不len(

在python中,给定数字
2.056e+07
2.05645e+07
,如何查找每个数字的有效数字?也就是尾数的长度。目的是比较数据输入的数字,只选择信息最多的数字

这些信息不知何故隐藏在(也许是)


使用
'2.05645e+07'。索引('e')
似乎是一种黑客行为。

稍微不那么黑客,但仍然可以改进:

len(''.join([str(x) for x in Decimal(2.05645e+07).as_tuple().digits]).rstrip('0'))
用支票更易读一点


为什么不
len(str(Decimal(2.05645e+07)).rstrip('0'))
?@L_'S:
len(str(Decimal(Decimal(2.05645e+01)).rstrip('0'))
这是个好问题。对于
2.05645e+01
的输入,您的解决方案的输出为
50
。这就是你想要的吗?@MarkDickinson:奇怪的是,如果先将参数转换为字符串,则可以避免这种行为…@serv inc:对。对于浮点文本,首先要转换为Python的二进制浮点格式,产生一个小的舍入错误,然后转换为十进制是精确的(因此保留了舍入错误)。直接从字符串转换时,不会引入舍入错误。
from types import StringType

def mantissa_length(string):
    '''>>> mantissa_length("2.05645e+07")
    6
    >>> mantissa_length("2.05645e+01")
    6'''
    assert type(string) is StringType, "this function fails for float values"
    digits = Decimal(string).as_tuple().digits
    return len(''.join([str(x) for x in digits]).rstrip('0'))