O MySQL não está dando um resultado falso, está simplesmente usando uma implementação diferente do módulo do que você espera. Infelizmente, o termo módulo parece ter sido definido de forma um tanto ambígua, e sua implementação varia de idioma para idioma. Pelo que posso dizer na Wikipedia no Módulo , a implementação do MySQL está usando divisão truncada :
r = a - n * trunc(a / n)
Onde você espera que a implementação use divisão por piso :
r = a - n * floor(a / n)
Como você implementou sua primeira solução alternativa, eu diria que é provavelmente a melhor alternativa para o
Mod
operador. Pelo que eu vi (e esta é uma análise não científica muito rápida!), parece que linguagens de programação mais imperativas implementam divisão truncada e linguagens matemáticas mais funcionais parecem usar a divisão por piso .