MySQL nie daje fałszywego wyniku, po prostu używa innej implementacji modułu niż oczekiwałeś. Niestety termin moduł wydaje się być zdefiniowany nieco niejednoznacznie, a jego implementacja różni się w zależności od języka. Z tego, co mogę powiedzieć w Wikipedii na Modulo , implementacja MySQL używa dzielenia obciętego :
r = a - n * trunc(a / n)
Gdzie oczekujesz, że implementacja użyje podziału dolnego :
r = a - n * floor(a / n)
Ponieważ w ten sposób zaimplementowałeś swoje pierwsze obejście, powiedziałbym, że jest to prawdopodobnie najlepsza alternatywa dla Mod
operatora.
Z tego, co widziałem (i jest to bardzo szybka nienaukowa analiza!), wydaje się, że bardziej imperatywne języki programowania implementują skrócony podział i bardziej funkcjonalne języki matematyczne wydają się używać dzielenia dolnego .