Python: 索引浮点数?
我有两组数据,正在用嵌套的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
希望这能帮到你