yai*_*chu 32
isInt x = x == fromInteger (round x)
> isInt 2
True
> isInt 2.5
False
Run Code Online (Sandbox Code Playgroud)
只是提醒一下:永远记住浮点数的全能诅咒:
> isInt (0.1^2*200)
False
> 0.1^2*200
2.0000000000000004
Run Code Online (Sandbox Code Playgroud)
小智 16
好的,所以这是晚了一年,但我很喜欢修改上述内容:
--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
Run Code Online (Sandbox Code Playgroud)
所以,例如isInt 4.0001 3返回True但isInt 4.0001 4返回False.用一个值运行它10几乎总是准确的,浮动错误将再次给你的问题; 我经常使用7.