Как проверить, является ли число с плавающей точкой целой в haskell?

Если у меня есть число с плавающей запятой в Haskell, как я могу проверить, является ли это целое число.

Ответы

Ответ 1

isInt x = x == fromInteger (round x)

> isInt 2
True
> isInt 2.5
False

И просто напоминание: всегда помните всемогущее проклятие чисел с плавающей запятой:

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

Ответ 2

Хорошо, так что это на год, но я большой поклонник модификации выше:

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

Итак, например isInt 4.0001 3 возвращает True, но isInt 4.0001 4 возвращает False. Запуск его со значением около 10 почти всегда является достаточно точным, что ошибки float будут тем, что снова дает проблемы; Обычно я использую 7.