2016-07-19 9 views
1

Ich habe einige Daten, die wie folgt aussieht:Python Fehler für große Zahl mod Betreiber

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

ich zu finden bin versucht, welcher Index um 1 Million teilbar ist.

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 

Für diesen Code I-Ausgang, wie immer bin:

5.02957566506e+17 
359 

Aber der Wert bei Index 359 ist 502957566506000020, für die die letzten 6 Ziffern sind nicht Null. Welchen Fehler mache ich hier?

+0

Ist 'my_data' einen String? –

+5

Sie lesen Ihre Ints offensichtlich als Floats, was zu Präzisionsverlusten führt. Lies deine Zahlen als Ints und es wird funktionieren. – Julien

+0

@JulienBernu welche Aussage sollte ich ändern? – shrey

Antwort

2

Verwenden Sie keine Indexvariablen wie i in Python. Wir sind im 21. Jahrhundert.

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) 

Ausgabe: Nichts.

1

Diese Art von Mehrdeutigkeit wird verursacht, wenn Sie Floats verwenden. Um die Berechnung präzise zu machen, sollten Sie sie in long oder int umwandeln und dann weitermachen. Angenommen, Sie lesen diese Daten aus der Datei.

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

Einverstanden, da ich mir nicht sicher bin, wo er die * my_data * erstellt hat, sollte idealerweise die Erstellung von my_data der Ort sein, an dem die int-Konvertierung durchgeführt wird. –

+0

Sie haben Recht, die Antwort aktualisiert. –

0

Sie verwenden Gleitkommazahlen mit begrenzter Genauigkeit. Überprüfen Sie Folgendes:

>>> 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 

Gleitkommazahlen haben eine begrenzte Genauigkeit. 502957566506000020 ist also nicht genau als Fließkommazahl darstellbar.

Bitte lesen: https://docs.python.org/3/tutorial/floatingpoint.html