为什么MySQL中的Modulo(带有负数)会产生意外结果?

时间:2018-10-17 03:35:17

标签: mysql math modulo

虽然我承认我对负数的模运算有些粗略,但我确实知道

-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

  • Python
  • R
  • Google计算器
  • Google表格
  • LibreOffice Calc
  • Ubuntu计算器

-2

  • JavaScript
  • MySQL
  • Microsoft计算器
  • PHP

正如评论中所指出的,此处是更详尽的列表:https://en.wikipedia.org/wiki/Modulo_operation

3 个答案:

答案 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的倍数。