2009-07-22 22 views

risposta

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

> isInt 2 
True 
> isInt 2.5 
False 

E solo un promemoria: ricordare sempre la maledizione onnipotente dei numeri in virgola mobile:

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

cool, c'è un built-in (per curiosità) – Peter

+2

@Peter: no, secondo Hoogle. – yairchu

+1

Attenzione che 'isInt (1/0) == True' – hvr

15

Okay, quindi questo è un anno di ritardo, ma io sono un grande fan di una modifica del quanto sopra:

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

Così, per esempio isInt 4.0001 3 rendimenti True ma isInt 4.0001 4 rendimenti False. Eseguirlo con un valore intorno a 10 è quasi sempre sufficientemente preciso da rendere gli errori float ciò che restituisce i problemi; Io di solito uso 7.

Problemi correlati