如何测试浮点数是否为haskell中的整数?

时间:2009-07-22 09:04:35

标签: haskell floating-point integer

如果我在Haskell中有一个浮点数,我如何测试它是否是整数。

2 个答案:

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