funktion ob ergebnis ganzzahl ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Andererseits ginge vielleicht auch das hier:

Code: Alles auswählen

import math

def is_integerish(x):
    return math.floor(x) == math.ceil(x)
Im Übrigen solte man erwähnen, dass floating point Zahlen so verglichen werden sollten:

Code: Alles auswählen

EPSILON = ... # hier bitte ein hinreichend kleines float zuweisen

def feq(x, y):
    return abs(float(x)-float(y)) < EPSILON
wobei EPSILON passend gewählt werden muss. Entsprechend würde der Code zum Testen von Ganzzahligkeit etwa so aussehen:

Code: Alles auswählen

def is_integerish(x):
    return feq(x, math.floor(x)) or feq(x, math.ceil(x))
Auch das kann allerdings in die Hose gehen, wenn EPSILON falsch gewählt wurde.
In specifications, Murphy's Law supersedes Ohm's.
JustinJ
User
Beiträge: 14
Registriert: Sonntag 15. Januar 2012, 15:59

wäre

Code: Alles auswählen

>>> a = 4.0000
>>> a == round(a, 0)
True
nicht auch eine idee?


demnach

Code: Alles auswählen

def is_integer(x):
    return x == round(x, 0)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Hmmmm …

Code: Alles auswählen

In [9]: a('round(1.234, 0) == 1.234')
Out[9]: 2.1165199279785156

In [10]: a('int(1.234) == 1.234')
Out[10]: 0.423098087310791
Edit: Hab was vergessen:

Code: Alles auswählen

def a(*args):
    return timeit.Timer(*args).timeit()
Edit #2: Noch krasserer Unterschied:

Code: Alles auswählen

In [11]: a('not 1.234 % 1')
Out[11]: 0.05470418930053711 # ca. 38,7× schneller :D
;)

Warum man timeit nicht trauen sollte!
Antworten