2009-07-22 38 views

Respuesta

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

> isInt 2 
True 
> isInt 2.5 
False 

Y sólo un recordatorio: recuerde siempre la maldición omnipotente de los números de punto flotante:

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

genial, ¿hay un built in (por curiosidad) – Peter

+2

@Peter: no, de acuerdo con Hoogle. – yairchu

+1

Tenga en cuenta que 'isInt (1/0) == True' – hvr

15

bien, así que este es un año de retraso, pero yo soy un gran fan de una modificación de lo anterior:

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

Así, por ejemplo isInt 4.0001 3 vuelve True pero isInt 4.0001 4 vuelve False. Ejecutarlo con un valor alrededor de 10 es casi siempre lo suficientemente preciso como para que los errores de float sean lo que vuelva a generar sus problemas; Usualmente uso 7.

Cuestiones relacionadas