Python 內建了三種不同的數字型態:ints、floats 和 complex。不過,這個練習只會用到 ints 和 floats。
ints 是整數,例如 1234、-10、20201278。
Python 的整數具有任意精度,位數只受限於主機系統的可用記憶體。
floats 是含有小數點的數字,例如 0.0、3.14、-9.01。
浮點數在 Python 中通常是用 C 的 double 實作(精確度為 15 位小數),但實際的表示方式會依主機系統和其他實作細節而有所不同。在處理浮點數時,這可能會帶來一些意想不到的結果,不過對大多數情況來說已經「夠好了」。
你可以在下列資源中看到更多細節與討論:
Python 完整支援 ints 和 floats 之間的算術運算。與二元算術運算子(+、-、*、/、// 和 %)搭配使用時,Python 會把較窄的數字轉換成較寬一方的型態。
Python 認為 ints 比 floats 窄,所以在運算式中使用浮點數,結果也一定是浮點數。不過進行除法時,即使只用整數,結果也一定是浮點數。
# The int is widened to a float here, and a float type is returned.
>>> 3 + 4.0
7.0
>>> 3 * 4.0
12.0
>>> 3 - 2.0
1.0
# Division always returns a float.
>>> 6 / 2
3.0
>>> 7 / 4
1.75
# Calculating remainders.
>>> 7 % 4
3
>>> 2 % 4
2
>>> 12.75 % 3
0.75
如果需要整數結果,可以用 // 截去小數部分。
>>> 6 // 2
3
>>> 7 // 4
1
要把浮點數轉成整數,可以使用 int();要把整數轉成浮點數,可以使用 float()。
>>> int(6 / 2)
3
>>> float(1 + 2)
3.0
你的朋友 Chandler 計劃到世界各地充滿異國風情的國家旅行。可惜的是,Chandler 的數學不太好。他很擔心在旅途中被貨幣兌換騙錢,所以希望你能幫他做一個貨幣計算機。以下是他為這個應用程式所列的規格:
建立exchange_money()函式,它接受 2 個參數:
budget:你打算兌換的金額。exchange_rate:相當於一單位外幣的本國貨幣金額。這個函式應該回傳兌換後的貨幣價值。
注意: 如果你的貨幣是 USD,而你想以1.20的匯率把 USD 兌換成 EUR,那麼1.20 USD == 1 EUR。
>>> exchange_money(127.5, 1.2)
106.25
建立get_change()函式,它接受 2 個參數:
budget:兌換前的金額。exchanging_value:從預算中取出用來兌換的金額。這個函式應該回傳預算中剩下的金額。
>>> get_change(127.5, 120)
7.5
建立get_value_of_bills()函式,它接受 2 個參數:
denomination:單張紙鈔的面額。number_of_bills:紙鈔的總張數。這個兌換窗口只收受特定面額單位的現金。 你收到的總金額必須能被一張「紙鈔」或單位的價值整除,而這可能會留下小數或餘數。 你的函式應該只回傳兌換窗口會找給你的紙鈔總價值(不含小數部分)。 可惜的是,剩下的餘數或零頭就歸兌換窗口所有,當作額外的好處。
>>> get_value_of_bills(5, 128)
640
建立get_number_of_bills()函式,接受amount和denomination。
這個函式應該回傳在給定的_amount_之內,你能收到的_紙鈔張數_。 換句話說:起始的金額裡可以容納多少張_整張的紙鈔_? 記住,你只能收到_整張的紙鈔_,不能收到不足一張的部分,所以要記得據此做除法。 實際上,你就是_向下_取整到最接近的整張紙鈔或面額。
>>> get_number_of_bills(127.5, 5)
25
建立get_leftover_of_bills()函式,接受amount和denomination。
這個函式應該回傳在給定紙鈔面額的情況下,無法從你起始的_amount_中兌換回來的_剩餘金額_。 確切知道兌換窗口能留下多少錢,非常重要。
>>> get_leftover_of_bills(127.5, 20)
7.5
建立exchangeable_value()函式,接受budget、exchange_rate、spread和denomination。
參數spread是以整數表示、作為兌換手續費收取的百分比。
你需要將它除以 100 換算成小數。
如果1.00 EUR == 1.20 USD,而spread是10,實際的匯率會是:1.00 EUR == 1.32 USD,因為 1.20 的 10% 是 0.12,而這筆額外的手續費會加到兌換上。
這個函式應該回傳在計算匯率加上spread之後,新貨幣的最大價值。 記住,貨幣的面額是整數,無法再細分。
注意: 回傳值應為int型別。
>>> exchangeable_value(127.25, 1.20, 10, 20)
80
>>> exchangeable_value(127.25, 1.20, 10, 5)
95