【发布时间】:2011-10-11 08:46:57
【问题描述】:
如果我的模块化划分是正确的; 1 / 5 mod 11 = 9。有人可以确认吗?
但是,在 Java 中; 1 / 5 % 11 = 0;
我不确定这里发生了什么,这是我的语法,我需要以某种方式将它括起来吗?
我现在很困惑:)
有人可以建议吗?
谢谢
【问题讨论】:
如果我的模块化划分是正确的; 1 / 5 mod 11 = 9。有人可以确认吗?
但是,在 Java 中; 1 / 5 % 11 = 0;
我不确定这里发生了什么,这是我的语法,我需要以某种方式将它括起来吗?
我现在很困惑:)
有人可以建议吗?
谢谢
【问题讨论】:
这与 (1/5) mod 11 相同。
(或者与 1 / (5 mod 11) 相同,仍然是 1/5 == 0 [从左到右实际上是 (1/5) mod 11])
1 / 5 = 0(整数)
0 模 11 = 0
【讨论】:
1 / 5 mod 11 = 9。有人可以确认吗?
(9 * 5) % 11 = 45 % 11 = 1。所以,是的,9 是“mod 11”中 5 的模乘逆。
问题是:Java 只有整数,没有模运算。在 Java 中,% 只是一个类似于* 的运算符。
来自http://en.wikipedia.org/wiki/Modular_arithmetic
模运算的概念与除法中的余数的概念相关。
所以,mod 11 和 % 11 是相关的,但不是一回事!
【讨论】:
http://www.difranco.net/cop2551/java_op-prec.htm 表示 *、/ 和 % 具有相同的优先顺序,但在表达式中 / 将优先于 %。所以你上面的 Java 结果是正确的 w.r.t JLS。
【讨论】:
这是因为运算符优先级。
Java 确实通过了它简化表达的地方。它执行一些操作,然后在下一次通过它执行一些其他操作。 “最高”运算符首先完成。例如乘法在加法之前。运算符( ) 在第一遍中,让您覆盖正常的事情完成顺序。
查看此图表:enter link description here
% 与* 和/ 在同一组中。它们是从左到右完成的。
所以你想要(1/5) % 11
但是您还有另一个问题,因为这将在浮点数学中完成,因此您将得到一个近似值而不是确切的正确答案。
您需要使用BigInteger 类而不是内置原语。
【讨论】: