【问题标题】:Why is this returning the wrong modulo answer? [duplicate]为什么这会返回错误的模数答案? [复制]
【发布时间】:2013-12-19 18:30:40
【问题描述】:
    private int mCurrentIndex = 0;
    mPrevButton = (Button)findViewById(R.id.prev_button);
    mPrevButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            mCurrentIndex = (-33 % 5);
            Log.i("IndexClick", String.valueOf(mCurrentIndex));
        }
    });

这将返回 -3 而不是 2。它使用正数进行数学运算。请帮助似乎无法找到解决方案。

【问题讨论】:

  • 为什么会返回 2?
  • @turbo 在谷歌搜索中输入 -33 % 5。
  • 啊,我现在明白了,从来不需要模负数
  • @turbo 我将遍历一个数组,我必须保护它免受负数的影响。

标签: java android


【解决方案1】:

使用% 运算符,根据JLS, Section 15.17.3,余数的符号必须与被除数的符号匹配(或为0):

二进制数值提升(第 5.6.2 节)后整数操作数的余数运算产生的结果值使得 (a/b)*b+(a%b) 等于 a。

从这个规则可以看出,余数运算的结果只有当被除数为负时才能为负,只有当被除数为正时才能为正。而且,结果的大小总是小于除数的大小。

事实上,(-33/5)*5 + (-33%5) 变成了-6*5 + (-3),等于-33

要获得积极的结果,您必须获得积极的红利。

【讨论】:

  • +1 用于 JLS。还要得到2 而不是-3 OP 可以在结果中加5,如果新结果不是负数,请再次使用模5,如(-33 % 5 + 5) %5
【解决方案2】:

根据JLS

整数操作数的余数运算产生一个结果值,使得 (a/b)*b+(a%b) 等于 a。

在您的示例中,a = -33 和 b = 5。因此:

(a/b)*b+(a%b) = -33
(-33/5)*5+(-33%5) = -33
(-6)*5+(-33%5) = -33
-30+(-33%5) = -33
(-33%5) = -3, as expected

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 2011-01-02
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多