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

Pet*_*ter 21 floating-point haskell integer

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

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)

  • @Peter:不,根据Hoogle的说法. (2认同)
  • 请注意,`isInt(1/0)== True` (2认同)

小智 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返回TrueisInt 4.0001 4返回False.用一个值运行它10几乎总是准确的,浮动错误将再次给你的问题; 我经常使用7.

  • 我发现 `isInt :: (Integral a, RealFrac b) => a -> b -> Bool` 和 `isInt nx = round (10 ^ fromIntegral n * (x - fromIntegral (round x))) == 0` a更可组合且易于阅读。 (2认同)