为什么这会返回错误的模数答案?

时间:2013-12-19 18:30:40

标签: java android

    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 个答案:

答案 0 :(得分:4)

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

  

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

     

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

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

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

答案 1 :(得分:0)

根据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