1. 程式人生 > >Python Expressive Puzzlers 3: Long Division

Python Expressive Puzzlers 3: Long Division

Python Expressive Puzzlers 3: Long Division

長整數的處理在每個程式語言都不同,例如我們會預期底下的Java程式碼會輸出 1000

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 的結果了。

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 裡呢?

MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000
MILLIS_PER_DAY = 24L * 60 * 60 * 1000
print(MICROS_PER_DAY / MILLIS_PER_DAY)