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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM