C#与Excel的模数有何不同?

时间:2016-02-14 15:55:00

标签: c# excel

我正在尝试使用负数字系统,我使用Excel来玩并检查我的计算。

我注意到C#与Excel存在差异。为什么C#返回的结果与Excel不同?

例如:

C#:146%-3 = 2

Excel:mod(146,-3)= -1

2 个答案:

答案 0 :(得分:10)

假设我们有四个整数:x,y,q和r,这样

 public class MainActivity extends FragmentActivity{
        private List<Fragment> listFragments;
        private ViewPager viewPager;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            viewPager = (ViewPager) findViewById(R.id.viewPager);

            Fragment_One fragment_one = new Fragment_One();
            Fragment_Two fragment_two = new Fragment_Two();

            listFragments = new ArrayList<>();
            listFragments.add(fragment_one);
            listFragments.add(fragment_two);

            PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(),listFragments);
            viewPager.setAdapter(pagerAdapter);

        }
    }

我希望商和余数必须有这种关系才有意义。

现在我们来看看C#和Excel之间的区别。差异实际上在划分,而不是其余部分。计算两个整数的商时,C#向零舍入,Excel向下舍入。也就是说,在C#8 / -3中是-2,在excel中,INT(8 / -3)是-3。

从这个事实你可以推断为什么剩余的不同。

答案 1 :(得分:5)

正如Wikipedia article所说,模运算是被除数除数 == 余数。当任一操作数为负值时,问题就出现了。那时,天真的数学定义崩溃了,结果变得依赖于实现。

在Excel中,mod运算符始终返回与除数符号相同的结果。在数学上,模运算中使用的商是向下舍入的(朝向-∞)。在伪代码中:

quotient = floor(dividend / divisor)
mod      = dividend - (divisor * quotient)

因此,对于146和-3:

quotient = -49      // floor(146 / -3)
mod      = -1       // 146 - (-3 * -49) == 146 - 147

在C#中,它是相反的:结果始终与被除数具有相同的符号。这是因为商被截断为0.在伪代码中:

quotient = truncate(dividend / divisor)
mod      = dividend - (divisor * quotient)

因此:

quotient = -48     // truncate(146 / -3)
mod      = 2       // 146 - (-3 * -48) == 146 - 144