【问题标题】:keeping same formatting for floating point values保持浮点值的格式相同
【发布时间】:2009-04-28 22:01:29
【问题描述】:

我有一个使用以下正则表达式读取浮点值的 python 程序

 (-?\d+\.\d+)

一旦我使用 float(match.group(1)) 提取值,我就会得到实际的浮点数。但是,我无法区分数字是 1.2345678 还是 1.234 还是 1.2340000。

我面临的问题是再次打印出浮点值,格式完全相同。一个简单的解决方案是在仍然是字符串时“拆分并计算”浮点值,eg 在小数点处拆分,并计算整数部分长度和小数部分长度,然后将格式化程序创建为

print "%"+str(total_len)+"."+str(fractional_len)+"f" % value

但也许您知道实现相同结果的标准方法?

【问题讨论】:

    标签: python formatting floating-point


    【解决方案1】:

    如果您想保持固定的精度,请避免使用floats 并改用Decimal

    >>> from decimal import Decimal
    >>> d = Decimal('-1.2345')
    >>> str(d)
    '-1.2345'
    >>> float(d)
    -1.2344999999999999
    

    【讨论】:

    • 更好的是,尽可能将其保留为字符串。
    【解决方案2】:

    你的方法基本正确。 字符串格式化有一个不太常用的 * 运算符,您可以将其用于格式化大小,这里有一些代码:

    import re
    
    def parse_float(str):
      re_float = re.compile(r'(-?)(\d+)\.(\d+)')
      grps = re_float.search(str)
      sign, decimal, fraction = grps.groups()
      float_val = float('%s%s.%s' % (sign, decimal, fraction))
      total_len = len(grps.group(0))
      print '%*.*f'  % (total_len, len(fraction), float_val)
    
    parse_float('1.2345678')
    parse_float('1.234')
    parse_float('1.2340000')
    

    然后输出

    1.2345678
    1.234
    1.2340000
    

    【讨论】:

      【解决方案3】:
      >>> from decimal import Decimal as d
      >>> d('1.13200000')
      Decimal('1.13200000')
      >>> print d('1.13200000')
      1.13200000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        • 2016-10-05
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        相关资源
        最近更新 更多