負數取餘,取餘和取模

感謝地心引力 2022-01-08 06:01:11 阅读数:727

1.圓整

就是把一個小數或者說浮點數按某種規律近似為一個它左邊或右邊最近的一個整數。比如:

  1. 向負無窮圓整
 1.8->1
1.2->1
-0.4->-1
-0.7->-1
  1. 向零圓整
1.6->1
1.2->1
-0.4->0
-0.7->0
  1. 四舍五入圓整
1.6->2
1.3->1
-0.2->0
-0.7->-1

在python有一個函數為round(),有點小特別,一般情况下為:

>>> round(1.2)
1.0
>>> round(1.6)
2.0
>>> round(-0.2)
-0.0
>>> round(-0.7)
-1.0

好像還在在意料之中。

特例1:

#python 3
>>>round(3.5)
>>>4
>>>round(2.5)
>>>2
#python 2
>>> round(3.5)
4.0
>>> round(2.5)
3.0
>>>

解析:

python2中如果浮點數距離兩端一樣遠,則保留到離0遠的一邊。所以round(0.5)會近似到1,而round(-0.5)會近似到-1。

python3.5中如果距離兩邊一樣遠,會保留到偶數的一邊。比如round(0.5)和round(-0.5)都會保留到0,而round(1.5)會保留到2。

特例2:

#python 2 or python 3
>>> round(2.675,2)
2.67

後面的2錶示要保留的小數比特數,結果為什麼不是2.68呢?

解析:

這跟浮點數的精度有關。我們知道在機器中浮點數不一定能精確錶達,因為換算成一串1和0後可能是無限比特數的,機器已經做出了截斷處理。那麼在機器中保存的2.675這個數字就比實際數字要小那麼一點點。這一點點就導致了它離2.67要更近一點點,所以保留兩比特小數時就近似到了2.67。關於浮點數,並不是想象中那樣簡單,後面我會補充一篇相關文章。

到這裏,對於python而言,我要說:

除非對精確度沒什麼要求,否則盡量避開用round()函數。或者選擇其他方法。
1)使用math模塊中的一些函數,比如math.ceiling(天花板除法)。
2)python自帶整除,python2中是/3中是//,還有div函數。
3)字符串格式化可以做截斷使用,例如 "%.2f" % value(保留兩比特小數並變成字符串……如果還想用浮點數請披上float()的外衣)。
4)對浮點數精度要求如果很高的話,請用decimal模塊。

2.取餘與取模

通常情况下,我們對取餘和取模混為一談,但是這兩個是不一樣的。在c、 c++ 、java、 python裏面都是用%錶示取模或者取餘的,但是我們分別用這四門語言去計算-1%3這個式子發現結果並不一樣,原因是在c、 c++、 java裏面%錶示取餘,而在python裏面%錶示取模。而我開頭提到的那本書直接將其混為一談,越看越氣。

進行計算的兩個數符號一樣時,取餘和取模的結果是一樣的,因為符號一樣時a/b總是非負數,那麼a%b的結果自然也是一樣的,這裏不再討論。

在進行計算的兩個數符號不一樣時,取餘和取模的結果是不一樣的,究其原因是下面公式中在計算c的時候趨向不同。

下面的式子中:c錶示a/b的商的整數部分(雖然//錶示取整,但用它來錶示取餘或者取模的商的整數部分是不合理的,此處僅僅作為一個記號使用),則r則為取餘或者取模的結果。取餘或者取餘的不同指出就在與:c的取值不同,取餘計算中c是向0取整,取模計算中c是向負無窮取整

c=a//b;
a=c*b+r;

3.實例解析

先來幾道題目給大家做做吧:

#分別計算下面4式取餘和取模的結果
>>> 10 % 3
>>> -10 % -3
>>> -10 % 3
>>>> 10 % -3

先睡覺了,明天補上下文

版权声明:本文为[感謝地心引力]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080601113952.html