Ответ 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
Если у меня есть число с плавающей запятой в Haskell, как я могу проверить, является ли это целое число.
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
Хорошо, так что это на год, но я большой поклонник модификации выше:
--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
.