为什么 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
- Python
- R
- Google 计算器
- Google 张
- LibreOffice 计算器
- Ubuntu计算器
-2
- Javascript
- MySQL
- 微软计算器
- PHP
正如评论中所指出的,这里有一个更详尽的列表: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且没有溢出。
虽然我承认我对负数的模运算有点粗略,但我知道
-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 计算器
- Ubuntu计算器
-2
- Javascript
- MySQL
- 微软计算器
- PHP
正如评论中所指出的,这里有一个更详尽的列表: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且没有溢出。