为什么 MySQL 中的 Modulo(负数)会给出意想不到的结果?

Why is Modulo in MySQL (with negative number) giving unexpected results?

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

-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

在 sql 中,当您执行 modulo 示例 Mod(x,y) 且 x 为否定答案时,结果的范围为 0 到 x-1。因此你得到了错误的输出。

或许您可以 mod 以您正在执行相同形式的 mod 的方式回答问题。

试试这样查询。

select ((x+y)+y%y) -> select ((-2+50)+50%50) 

应该可以。

您可以使用 中的除法来实现您自己的 MOD 版本,但最简单的解决方案可能是执行 MOD 两次,在操作之间添加 50:

SELECT MOD(MOD(input, 50)+50, 50)

无论输入值如何,这都会为您提供正确的结果。

不幸的是,编程语言世界中的许多 MOD 函数和 % 运算符并未实现数学意义上的 modulo 函数:对于否定参数,它们 return - (|a| mod b) 代替。

解决方法:

  • 如果 a < 0,使用 MOD(a + b - 1, b);

  • 使用MOD(a + c, b) 其中c是b的倍数如果保证a + c >= 0且没有溢出。