MySQL ger dig inte ett falskt resultat, det använder helt enkelt en annan implementering av modul än du förväntar dig. Tyvärr verkar termen modul ha definierats något tvetydigt, och dess implementering varierar från språk till språk. Vad jag kan säga i Wikipedia på Modulo , MySQL:s implementering använder trunkerad division :
r = a - n * trunc(a / n)
Där du förväntar dig att implementeringen ska använda golvuppdelning :
r = a - n * floor(a / n)
Eftersom det här hur du implementerade din första lösning, skulle jag säga att det förmodligen är det bästa alternativet till Mod
operatör.
Av vad jag har sett (och det här är en mycket snabb ovetenskaplig analys!), verkar det som om mer imperativa programmeringsspråk implementerar trunkerad division och mer funktionella matematiska språk verkar använda golvdivision .