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>