【问题标题】:Python: indexing floats?Python:索引浮点数?
【发布时间】:2023-04-06 11:44:01
【问题描述】:

我有两组数据,我通过 Python 中的嵌套 for 循环读取它们。我需要使用一个公共数字(时间)匹配两个不同文本文件的行。在这两个文件中,时间的写法不同(例如 21:53:28.339 与 121082008.3399)。我只需要时间的最后四位来匹配它们,例如从 21:53:28.339 开始,我只需要“8.339”。在大多数情况下,将数字索引为字符串就可以正常工作(例如:timeList[nid][7:]),除了上面列出的数字等情况,python 将 .3399 舍入为 0.34。

有没有办法让我保持浮点形式的数字并从数据中选择不四舍五入的数字?

谢谢!

【问题讨论】:

    标签: python string floating-point indexing


    【解决方案1】:

    编辑 - 仅使用 Decimal - 完整示例

    import decimal
    
    def simplify(text):
        # might be a : separated value
        text = text.split(':')[-1]
        # turn into decimal
        number = decimal.Decimal(text)
        # remove everything but the ones place and forwards
        number = number - (number/10).quantize(1, rounding=decimal.ROUND_FLOOR) * 10
        # truncate to the thousandths
        return number.quantize(decimal.Decimal('.001'), rounding=decimal.ROUND_FLOOR)
    
    a = '121082008.3399'
    b = '21:53:28.339'
    
    assert simplify(a) == simplify(b)
    print simplify(a), '=', simplify(b)
    

    Scott 如果您使用字符串比较数字,那么您不需要任何浮点数,并且不会进行“四舍五入”。

    '8.339' == '8.339'
    

    或者,如果你有

    a = '8.3399'
    b = '8.339'
    

    然后

    a[:-1] == b
    

    但是,如果您决定将它们用作“数字”,那么正如 Ignacio 指出的那样,您可以使用小数。

    from decimal import Decimal
    number_a = Decimal(a[:-1])
    number_b = Decimal(b)
    

    现在

    number_a == number_b
    

    希望有帮助

    【讨论】:

      【解决方案2】:

      从您的描述来看,您希望使用小数点前一位数和小数点后三位数进行比较,使用截断而不是四舍五入。所以就这样做吧:

      >>> def extract(s):
      ...     i = s.find('.')
      ...     return s[i-1:i+4]
      ...
      >>> map(extract, ['21:53:28.339', '121082008.3399'])
      ['8.339', '8.339']
      >>>
      

      【讨论】:

        【解决方案3】:

        使用decimal.Decimal 而不是float

        【讨论】:

        • 关于如何忽略数字的第一部分的任何想法(从 121082008.3399 我只想要 8.339 - 基本上只是砍掉数字的第一部分和最后一部分。)同时使用小数模块?谢谢!
        • @Scott:使用十进制模块是极端的大材小用......只是砍掉你的字符串;看我的回答。
        猜你喜欢
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多