为什么Java的%运算符给出的结果与我的计算器的结果不同?

rub*_*buc 4 c java math modulus

怎么来计算器-1 mod 26 = 25,但是用C或Java -1 % 26 == -1.我需要一个像计算器一样解决它的程序.这两者有区别吗?

Mys*_*ial 6

两个答案(25和-1)都有效.只是不同的系统有不同的约定.

我认为最常见的(数学)是:

quotient  = floor(x / y)
remainder = x - quotient * y
Run Code Online (Sandbox Code Playgroud)

floor()向负无穷大方向转向何处.

这是您的计算器给您的约定.(Mathematica也使用这个惯例.)

我认为大多数编程语言使用的是:

quotient  = integerpart(x / y)
remainder = x - quotient * y
Run Code Online (Sandbox Code Playgroud)

其中integerpart()相同的(浮- >整数)的流延.(向零舍入)

一些惯例喜欢将余数保持为与其中一个操作数相同的符号.

同样的事情适用于分隔符的符号.不同的惯例是不同的.


Ste*_*n C 5

"怎么会 ... ?"

模运算有两种常见的定义.Java选择了一个("与分红相同的符号"),计算器实现另一个; 可能是"与除数相同的符号",尽管你需要做一些实验才能确定.

事实上,模数操作的维基百科页面给出了不同编程语言使用的4种不同的运算符定义.(有些编程语言为您提供了两个具有不同语义的运算符.)

在C的情况下,定义取决于您所谈论的C标准的版本.对于ISO C 1999,模运算符遵循与Java相同的定义.对于早期版本C标准的,语义%是依赖于实现

"两者之间有区别吗?"

显然有!

"我需要一个像计算器一样解决它的程序."

随意写一个:-).

但是如果你只是想知道如何在Java中获得与模数相同的"除数"形式,这里有一种方法:

int otherModulus = (a % b) + (a < 0 ? b : 0);  // works for b > 0.

int otherModulus = (a % b) +                   // works for b != 0
                   (b > 0 ? (a < 0 ? b : 0) : (a > 0 ? -b : 0));
Run Code Online (Sandbox Code Playgroud)