我有一个列表区域:: [双]。现在我想过滤这个列表中那些实际上是整数值的列表。我想为我的谓词做这样的事情:
isInteger :: Double -> Bool
isInteger x = abs (fromIntegral (floor x) - x) < delta
where delta = 0.00001
但是,我想有更好的方法可以做到这一点。是否有用于检查实数值是否为整数的 Haskell 习语?
我有一个列表区域:: [双]。现在我想过滤这个列表中那些实际上是整数值的列表。我想为我的谓词做这样的事情:
isInteger :: Double -> Bool
isInteger x = abs (fromIntegral (floor x) - x) < delta
where delta = 0.00001
但是,我想有更好的方法可以做到这一点。是否有用于检查实数值是否为整数的 Haskell 习语?
尽管您可能想要使用round
而不是floor
. 您还可以考虑使用approxRational
并检查结果的分母是1
:
isInteger x = denominator (approxRational x 0.00001) == 1