2009-07-22 9 views

Odpowiedz

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

> isInt 2 
True 
> isInt 2.5 
False 

I tylko przypomnienie: zawsze pamiętać wszechmocny klątwę z liczb zmiennoprzecinkowych:

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

fajnie, czy jest wbudowany (z ciekawości)? – Peter

+2

@Peter: nie, według Hoogle. – yairchu

+1

Należy pamiętać, że 'isInt (1/0) == True' – hvr

15

Ok, więc jest to rok późno, ale jestem wielkim fanem modyfikacji powyżej:

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

Tak więc, na przykład isInt 4.0001 3 powraca True ale isInt 4.0001 4 powraca False. Uruchomienie go o wartości około 10 jest prawie zawsze na tyle dokładne, że błędy pływaka spowodują ponowne problemy; Zwykle używam 7.