【问题标题】:Why is Modulo in MySQL (with negative number) giving unexpected results?为什么 MySQL 中的 Modulo(负数)会给出意想不到的结果?
【发布时间】:2018-10-17 03:35:17
【问题描述】:

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

-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
  • 微软计算器
  • PHP

正如 cmets 中所指出的,更详尽的列表如下:https://en.wikipedia.org/wiki/Modulo_operation

【问题讨论】:

  • 相关问题here.
  • Windows 计算器计算 -2 % 50 = -2。所以,我无法重现与 MySQL 不一致的东西。
  • 谷歌计算器也等于 48:google.com/search?q=-2+%25+50
  • PHP 也表示 -2 3v4l.org/8scNn
  • 而且... R 给出 48。战争结束了。国王万岁。

标签: mysql math modulo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    也许您可以通过执行相同形式的 mod 的方式对问题进行建模。

    尝试像这样进行查询。

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

    应该可以。

    【讨论】:

      【解决方案3】:

      不幸的是,编程语言世界中的许多 MOD 函数和 % 运算符没有实现数学意义上的模函数:对于负参数,它们返回 -(|a| mod b)。

      解决方法:

      • 如果a

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-26
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        相关资源
        最近更新 更多