2016-07-19 2 views
1

У меня есть некоторые данные, которые выглядят следующим образом:ошибка питон для большого числа мод оператора

353: 340122810048577428 
354: 363117512048110005 
355: 387632532919029223 
356: 413766180933342362 
357: 441622981929358437 
358: 471314064268398780 
359: 502957566506000020 
360: 536679070310691121 
361: 572612058898037559 
362: 610898403751884101 
363: 651688879997206959 

Я пытаюсь найти какой индекс делится на 1 млн.

index = my_data[:,0] 
values = my_data[:,1] 

k = 0 
for i in values: 
    k += 1 
    if i % 1000000 == 0 : 
     print i 
     break 

print k-1 

Для этого кода я получаю выход, как:

5.02957566506e+17 
359 

Но значения в индексе 359 502957566506000020, для которых последние 6 цифр не равны нулю. Какую ошибку я делаю здесь?

+0

ли 'my_data' строку? –

+5

Вы, очевидно, читаете свои ints как поплавки, которые создают потерю точности. Прочитайте свои номера как ints, и это сработает. – Julien

+0

@JulienBernu, какое заявление следует изменить. – shrey

ответ

2

Не используйте индексные переменные, такие как i в Python. Мы находимся в 21 веке.

s = """353: 340122810048577428 
354: 363117512048110005 
355: 387632532919029223 
356: 413766180933342362 
357: 441622981929358437 
358: 471314064268398780 
359: 502957566506000020 
360: 536679070310691121 
361: 572612058898037559 
362: 610898403751884101 
363: 651688879997206959""" 


for line in s.split("\n"): 
    k, v = line.split(":") 
    if int(v.strip()) % 1000000 == 0: 
     print(k) 

Выход: ничего.

1

Этот тип двусмысленности вызывается при использовании поплавков. Чтобы точно вычислить, вы должны преобразовать их в long или int, а затем продолжить. Предполагая, что вы читаете эти данные из файла.

f = open('data.csv') 
my_data = [] 
for line in f: 
    a = line.split(':') 
    my_data+=[[int(a[0]), int(a[1])]] 

for i in my_data: 
    if i[1] % 1000000 == 0 : 
     print i 
     break 
+0

Согласен, так как я не уверен, где он создал * my_data *, в идеале создание my_data должно быть местом обработки int-преобразования. –

+0

Вы правы, обновили ответ. –

0

Вы используете числа с плавающей запятой с ограниченной точностью. Проверьте это:

>>> 502957566506000020 % 1000000 
20 

>>> float(502957566506000020) 
5.02957566506e+17 
>>> 502957566506000020.0 
5.02957566506e+17 
>>> float(502957566506000020) % 1000000 
0.0 
>>> 502957566506000020.0 % 1000000 
0.0 
>>> int(502957566506000020.0) 
502957566506000000 

Номера с плавающей запятой имеют ограниченную точность. Таким образом, 502957566506000020 точно не представляет собой число с плавающей запятой.

Пожалуйста, прочитайте: https://docs.python.org/3/tutorial/floatingpoint.html