Python Expressive Puzzlers 3: Long Division

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

長整數的處理在每個程式語言都不同,例如我們會預期底下的Java程式碼會輸出 1000
1
2
3
4
5
6
7
public class LongDivision {
  public static void main(String[] args) {
    final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
    final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
    System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
  }
}
但是結果卻是5。這是為什麼呢?Java在處理整數數字時是以 int 的型態來處理的,上述的程式碼雖然有指定用 long 的型態,但是  24 * 60 * 60 * 1000 * 1000 與 24 * 60 * 60 * 1000 都是以 int 的型態來進行運算的。int的最大值為 2147483647 。其中 MICROS_PER_DAY 的結果超過 int 最大值,溢位(Overflow)了。只要將程式改成下面就可以輸出 1000 的結果了。
1
2
3
4
5
6
7
public class LongDivision {
  public static void main(String[] args) {
    final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
    final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
    System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
  }
}
"Java Puzzlers"一書提醒讀者:「When working with large numbers, watch out for overflow—it’s a silent killer.」

那在 Python 裡呢?
1
2
3
MICROS_PER_DAY = MICROS_PER_DA 24L * 60 * 60 * 1000 * 1000
MILLIS_PER_DAY = 24L * 60 * 60 * 1000
print(MICROS_PER_DAY / MILLIS_PER_DAY)

沒有留言: