如果我在Haskell中有一个浮点数,我如何测试它是否是整数。
答案 0 :(得分:29)
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
答案 1 :(得分:15)
好的,所以这是晚了一年,但我很喜欢修改上述内容:
--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
左右的值运行它几乎总是准确的,浮动错误将再次给你的问题;我通常使用7
。