2016-10-25 4 views
2

Ich versuche, ein Programm in Python 2.7 zu schreiben, die zuerst sehen, ob eine Zahl die andere gleichmäßig teilt, und wenn es das Ergebnis der Division erhält.Ich mache Fehler bei der Division von großen Zahlen

Allerdings bekomme ich einige interessante Ergebnisse, wenn ich große Zahlen verwende.

Derzeit verwende ich:

from __future__ import division 
import math 
a=82348972389472433334783 
b=2 
if a/b==math.trunc(a/b): 
    answer=a/b 
    print 'True' #to quickly see if the if loop was invoked 

Als ich das laufen erhalte ich:

True 

Aber 82348972389472433334783 eindeutig nicht gerade ist.

Jede Hilfe wäre willkommen.

+0

Willst du nicht den Modul von "a" geteilt durch 2 prüfen? Ich würde empfehlen, das 'if' zu' if a% 2: 'zu ändern. Dies wird Ihnen "0" geben, wenn "a" gerade ist, "1", wenn "a" ungerade ist. Denn was ich glaube, dass du effektiv tust, ist zu vergleichen, ob 'a/b 'gleich' a/b 'ist (du dividierst ganze Zahlen, also hat' trunc' keinen Effekt, richtig?) – BorrajaX

+4

Ergebnis der Division ist ein Fließkomma Nummer. Sie fragt einfach "[ist Fließkomma-Mathe gebrochen?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken)" –

+0

@ user2357112 Das Ergebnis der Division * ist * ein float, weil "von __future__ Einfuhrdivision". – jme

Antwort

5

Das ist eine verrückte Art, es zu tun. Verwenden Sie einfach den Restoperator.

if a % b == 0: 
    # then b divides a evenly 
    quotient = a // b 
+0

Das würde mich wissen lassen, ob es gleichmäßig aufgeteilt ist, aber wie würde ich wissen, was das genaue Ergebnis wäre? Ich muss die genaue Teilung wissen, wenn sie später in meinem Code gleichmäßig teilbar ist. – Dan

+3

Wenn mit "verrückt" meinst du "falsch". –

+0

Hinzugefügt den Code für den Quotienten – wim

0

Warum verwenden Sie nicht stattdessen den Modulo-Operator, um zu prüfen, ob eine Zahl gleichmäßig aufgeteilt werden kann?

n% x == 0

1

Die wahre Teilung implizit konvertiert die Eingabe in Schwimmern, die den Wert von a speichern genau nicht die Präzision. Z.B. an meinem Gerät

>>> int(1E15+1) 
1000000000000001 
>>> int(1E16+1) 
10000000000000000 

daher verlieren Sie die Präzision. Ähnliches passiert mit Ihrer großen Nummer (vergleiche int(float(a))-a).
Nun, wenn Sie Ihre Abteilung überprüfen, sehen Sie das Ergebnis „wird“ gefunden tatsächlich eine ganze Zahl

>>> (a/b).is_integer() 
True 

die wiederum nicht wirklich vorher erwartet wird, zu sein.

Die math.trunc Funktion macht etwas Ähnliches (aus dem docs): Rückkehr der reale Wert auf ein Integral abgeschnitten x (in der Regel eine lange ganze Zahl).

Die Ente Typisierung Art von Python ermöglicht einen Vergleich der long integer und float, Comparing a float and an int in Python Checking if float is equivalent to an integer value in python und sehen.

Verwandte Themen