为什么mysql中的模(带负数)会产生意外的结果?

eaf3rand  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(448)

虽然我承认我对负数的模运算略知一二,但我知道这一点

-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
谷歌计算器
谷歌工作表
libreoffice计算
ubuntu计算器
-2
javascript语言
mysql数据库
microsoft计算器
PHP
正如评论中所指出的,更详尽的清单如下:https://en.wikipedia.org/wiki/modulo_operation

cs7cruho

cs7cruho1#

在sql中,当您对示例mod(x,y)进行模运算时,x是一个否定的答案,结果是从0到x-1的范围内给出的。因此,您得到了错误的输出。
也许你可以用这样一种方式来模拟这个问题,即你正在执行相同形式的mod。
试着这样做。

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

应该有用。

jaql4c8m

jaql4c8m2#

不幸的是,编程语言中的许多mod函数和%运算符并没有实现数学意义上的模函数:对于负参数,它们返回-(| a | mod b)。
解决方法:
如果a<0,使用mod(a+b-1,b);
如果保证a+c>=0并且没有溢出,则使用mod(a+c,b),其中c是b的倍数。

rqenqsqc

rqenqsqc3#

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

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

无论输入值是多少,这都将为您提供正确的结果。

相关问题