2009-07-22 10 views

Antwort

24
isInt x = x == fromInteger (round x) 

> isInt 2 
True 
> isInt 2.5 
False 

Und nur zur Erinnerung: immer daran denken, den allmächtigen Fluch der Gleitkommazahlen:

> isInt (0.1^2*200) 
False 
> 0.1^2*200 
2.0000000000000004 
+0

cool, ist da ein eingebaut (aus Neugier) – Peter

+2

@Peter: nein, nach Hoogle. – yairchu

+1

Beachten Sie, dass 'isInt (1/0) == True' – hvr

15

Okay, so ist dies ein Jahr zu spät, aber ich bin ein großer Fan von einer Modifikation die oben:

--Returns if x is an int to n decimal places 
isInt :: (Integral a, RealFrac b) => b -> a -> Bool 
isInt x n = (round $ 10^(fromIntegral n)*(x-(fromIntegral $ round x)))==0 

So zum Beispiel isInt 4.0001 3 kehrt True aber isInt 4.0001 4 kehrt False. Es mit einem Wert um 10 läuft fast immer genau genug, dass Float-Fehler werden, was Ihre Probleme wieder gibt; Normalerweise verwende ich 7.

Verwandte Themen