在 JavaScript 中:
console.log(13 % 5);
// Expected output: 3
console.log(-13 % 5);
// Expected output: -3
我在 Haskell 中也需要同样的东西。我做到了
:{
modulo :: Double -> Int -> Double
modulo a p =
let p' = fromIntegral p
in
if a > 0
then a - fromIntegral(p * floor(a/p'))
else a - fromIntegral(p * ceiling(a/p'))
:}
这似乎有效(至少我发现与 JavaScript 的结果相同)。有更好的办法吗
与
rem
相反,它应该适用于 Double
a
:
ghci> modulo (-13.5) 5
-3.5
rem :: Integral a => a -> a -> a
:
ghci> 13 `rem` 5
3
ghci> (-13) `rem` 5
-3
Haskell 有两对关于除法和取模的函数:
div
和 mod
,它们向负无穷大截断;以及 quot
和 rem
向零截断。
或对于
RealFrac
类型:
fracRem :: (RealFrac a, Integral b) => a -> b -> a
fracRem x y = x - fromIntegral (y * (truncate x `quot` y))