我正在尝试使用负数字系统,我使用Excel来玩并检查我的计算。
我注意到C#与Excel存在差异。为什么C#返回的结果与Excel不同?
例如:
C#:146%-3 = 2
Excel:mod(146,-3)= -1
答案 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