這個計算機能做什麼
找零計算機可以算出顧客在現金交易中應拿回多少零錢,並把這個金額拆解成最實用、張數最少的鈔票與硬幣組合。它是一個通用工具,不限於任何單一地區,讓你從多種常見的世界貨幣中挑選,包括美元(USD,預設值)、歐元(EUR)、英鎊(GBP)、加幣(CAD)、澳幣(AUD)、墨西哥披索(MXN)、菲律賓披索(PHP)、紐幣(NZD)以及巴西里爾(BRL)。
使用方式
先選擇貨幣與模式。在「計算找零」模式下,輸入商品售價與顧客付款金額,工具會以「收款金額減去售價」算出應找的零錢。在「直接輸入找零金額」模式下,你可以直接填入找零金額,跳過售價的運算。計算結果會顯示應找零金額,並附上一張表格,依面額由大到小列出每種鈔票與硬幣需要給幾張(枚),以及總共需要的張數與枚數。
公式與演算法
首先算出找零金額:
$$C = \text{Tendered} - \text{Purchase}$$(或直接輸入的金額)。為了避免浮點數運算誤差,系統會將金額乘以 100 並四捨五入,換算成最小單位(分)。接著以貪婪演算法(greedy)從最大面額逐一往小循環,每種面額取
$$n_d = \left\lfloor \frac{r}{d} \right\rfloor,\quad r \leftarrow r - n_d\,d$$枚,再從剩餘金額中扣除。對於美元、歐元、英鎊這類標準(canonical)的貨幣面額系統,貪婪演算法所得到的結果,正好就是張數與枚數最少的最佳解。
實例演練
以美元為例,售價 $7.50,顧客付款 $20.00。找零
$$\text{Change} = \$20.00 - \$7.50 = \$12.50 = 1250 \text{ 分}$$貪婪演算法:一張 $10(剩 250 分)、一張 $2(剩 50 分)、一枚 50¢ 硬幣(剩 0)。結果:\(1 \times \$10\)、\(1 \times \$2\)、\(1 \times 50¢\) —— 總共 3 件。
常見問題
為什麼要換算成「分」?以最小單位(整數的分)進行運算,可以避免像 12.499999 這類誤差,導致多算出一分錢的情形。
如果我停用某個面額會怎樣?貪婪演算法仍會就剩下可用的面額進行拆解;如果無法湊到剛好歸零,它會回報剩餘無法找開的金額。建議保留最小面額的硬幣,才能確保找零金額正好湊齊。
貪婪演算法一定是最佳解嗎?對於各國標準的貨幣面額系統來說,是的。但若使用特殊面額組合,或停用了某些面額,它會給出一個有效、卻不一定是全域最少件數的拆解結果。