10%-3 = -2 取余运算详解
背景:今天一个同学在看python看到一个问题 10%-3的结果是多少,我心中默默出现了1这个结果,
因为很明显 10=(-3)*(-3).....1 ,但是,书上写的结果是-2;于此产生分歧。
检验方法:首先,我是接受不能的,怎么可能呢,于是就写了一个方法测试一下,毕竟 talk is cheap ,show me the code.
方法很简单,直接输出一下,不就行了嘛,
System.out.println(10%-3);
不出所料,结果为 1;
难道书上写错了,秉承多次验证的严谨编程精神,我去询问了百度和我的高数老师[手动滑稽],然后发现没百度到,
于是查了一下余数的定义:(https://baike.baidu.com/item/%E4%BD%99%E6%95%B0/6180737?fr=aladdin)
在整数的除法中,只有能整除与不能整除两种情况。当不能整除时,就产生余数,所以余数问题在小学数学中非常重要
(划重点:小学数学。我对不起我的小学数学老师。)。
另外百度买一送一,还有取余运算的定义。
取余数运算:
a mod b = c 表示 整数a除以整数b所得余数为c。
余数的计算公式:c = a -⌊ a/b⌋ * b
其中,⌊ ⌋为向下取整运算符,向下取整运算称为Floor,用数学符号⌊ ⌋表示。
敲黑板,重点,向下取整。
在这时,高数老师上场了,他给了具体的回应,按照这个定义 10对-3进行取整的结果 是 -4。
此时的我一脸懵逼,不应该啊。默默敲了一个输出:
System.out.println(10/(-3));
对,秉承严谨的编程精神,我给-3加上了括号。然而并没有拯救我,结果是 -3。
然后,老师就开始讲解概念:向下取整 ,-3点多 应该为 -4。 我默默打开了百度,java 向下取整。
查询结果:
向上取整用Math.ceil(double a)
向下取整用Math.floor(double a)
哦~,原来如此,验证一下,
编写输出方法,System.out.println(Math.floor(10/(-3)));
这下应该正确了吧。
Native,输入结果 :-3.0;
emmm,什么鬼,经过数学老师的讲解,再次感谢高数老师,对一个毕业的学生还有这么好的耐心[手动狗头]。
正确的运算策略应该是:对10除以-3的运算结果,进行向下取整 ,也就是对 -3.33333进行向下取整,结果是 -4。
带入取余公式:c = a -⌊ a/b⌋ * b --> c = 10 - (-4)*-3 = -2。
综合起来就是:10 ÷ -3 = -4…-2 。
unbelievable,可以百度一下余数,看一下余数的性质,验证一下,是否符合。
这是一道严肃的编程题,所以在确定了运算策略后,重新设计输出:
double x=10;
double y= -3;
System.out.println(x - Math.floor(x/y)*y);//取余运算公式
输出结果为:-2.0
呼~终于算对了。 这题的关键在于,是对 10除以-3的结果 也就是 -3.33333 进行 向下取整,结果为-4。
之前的设计:System.out.println(Math.floor(10/(-3)));
是对 10整除-3的结果 也就是-3 进行向下取整,所以结果为-3.0;
所以,最后的结论就是:10除以-3 等于 -4 余 -2 。而我们java中取余运算,不能全部都靠取余运算符(%),小学数学知识还是很关键的。
结语:
emmmm,我真的对不起我的小学数学老师,当时应该好好学习的。[手动滑稽]
感谢我的高数老师,为我排异解惑。[狗头]
2018-10-22 00:01:34