Python: 索引浮点数?

1 投票
3 回答
1987 浏览
提问于 2025-04-16 16:21

我有两组数据,正在用嵌套的for循环在Python中读取。我的目标是通过一个共同的数字(时间)来匹配两个不同文本文件中的行。在这两个文件中,时间的写法不一样(比如,21:53:28.339和121082008.3399)。我只需要时间的最后四位数字来进行匹配,比如从21:53:28.339中,我只需要'8.339'。大多数情况下,把这个数字当成字符串来处理是没问题的(例如:timeList[nid][7:]),但在某些情况下,比如上面提到的数字,Python会把.3399四舍五入成.34。

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

谢谢!

3 个回答

0

decimal.Decimal 来代替 float

1

根据你的描述,你想要比较的是小数点前面一位数字和小数点后面三位数字,而且是用截断的方式,而不是四舍五入。那你就直接这样做:

>>> 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 - 这里有完整的例子

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

希望这能帮到你

撰写回答