虽然我承认我对负数的模运算有些粗略,但我确实知道
-2 mod 50 = 48
几乎在每个在线模计算器以及LibreOffice Calc中:
=MOD(-2,50)
和Python:
-2 % 50
这个数字(48
)很方便,这是我在MySQL过程中编写的函数所需要的答案。但是,在MySQL中:
SELECT MOD(-2,50)
因此给我-2
。
这是什么原因,如何在MySQL中获得所需的结果?
对于后代:
截至2018年,以下语言提供了与-2 % 50
不同的结果:
48
-2
正如评论中所指出的,此处是更详尽的列表:https://en.wikipedia.org/wiki/Modulo_operation
答案 0 :(得分:2)
在sql中,当您对Mod(x,y)取模时,并且x为否定答案,结果从0到x-1范围给出。因此您得到错误的输出。
也许您可以以执行相同形式的mod的方式对问题进行建模。
尝试像这样进行查询。
select ((x+y)+y%y) -> select ((-2+50)+50%50)
应该工作。
答案 1 :(得分:2)
您可以像this question那样使用除法来实现自己的MOD
版本,但是可能最简单的解决方案是执行两次MOD
,两次操作之间加50:
SELECT MOD(MOD(input, 50)+50, 50)
这将为您提供正确的结果,而与输入值无关。
答案 2 :(得分:1)
不幸的是,编程语言领域中的许多MOD函数和%运算符在数学意义上都没有实现模函数:对于负参数,它们返回-(| a | mod b)。
解决方法:
如果a <0,则使用MOD(a + b-1,b);
使用MOD(a + c,b),如果保证a + c> = 0并且没有溢出,则c是b的倍数。