MySQL ne vous donne pas un faux résultat, il utilise simplement une implémentation de module différente de celle à laquelle vous vous attendez. Malheureusement, le terme module semble avoir été défini de manière quelque peu ambiguë et sa mise en œuvre varie d'une langue à l'autre. D'après ce que je peux dire dans le Wikipedia sur Modulo , l'implémentation de MySQL utilise la division tronquée :
r = a - n * trunc(a / n)
Où vous vous attendez à ce que la mise en œuvre utilise la division par étage :
r = a - n * floor(a / n)
Depuis que vous avez implémenté votre première solution de contournement, je dirais que c'est probablement la meilleure alternative au Mod
opérateur.
D'après ce que j'ai vu (et c'est une analyse non scientifique très rapide !), il semble que des langages de programmation plus impératifs implémentent la division tronquée et les langages mathématiques plus fonctionnels semblent utiliser la division par étage .