在OCaml中,-1 mod 3;;
返回-1
,但我希望结果是2
。还有其他附加的模指令或类似的指令吗?
答案 0 :(得分:5)
Ocaml遵循模的C定义:
当整数相除时,/运算符的结果是代数商,其中舍弃了任何小数部分。90)如果商a / b可表示,则表达式(a / b)* b + a%b等于
90)这通常称为“向零截断”。
这意味着它将给出-n + 1到n-1或0到n-1的余数。这是如何实现划分的不幸的副作用。对绝对值进行除法并最终纠正符号。
要获得正模,可以使用:
# let (mod) x y = ((x mod y) + y) mod y;;
val ( mod ) : int -> int -> int = <fun>
# -1 mod 3;;
- : int = 2
# 4 mod 3;;
- : int = 1
或
# let (mod) x y = let res = x mod y in if res < 0 then res + y else res;;
val ( mod ) : int -> int -> int = <fun>