iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
自我挑戰組

30 天養大一個開源專案:baodao-skill 從零開始系列 第 27 篇

【Day 27】58 級距全部對上,只有 150,000 那級差 1 元:Python 的 round 踩到四捨五入

  • 分享至 

  • xImage
  •  

前一篇結尾我寫「0.8.5 還沒被排程 run 驗證過」。2026-10-03 的排程 run 在 16:14 UTC 跑完,所有步驟綠燈,issue #8 也被 workflow 自動關掉。排程 run 在 9/29、9/30、10/1、10/2 連紅四次,到這一次才算真的修好:https://github.com/tahodev/baodao-skill/actions/runs/37136136935

路線圖剩 5 項,這次做完 2 項

docs/roadmap.md 的新技能候選 24 項,打勾的只有 20 項,剩下:綜合所得稅試算、圖書館館藏查詢、國道即時路況、勞健保費率計算、其他縣市垃圾車。10/3 做完兩個:taiwan-income-tax 和 taiwan-labor-health-insurance,版本 0.9.0,倉庫現在 27 個技能。

這兩個和 taiwan-id-check 一樣是純本地計算,不呼叫任何 API。沒有網路請求,就沒有 HTTP 錯誤可以提醒我哪裡壞了。數字算錯是安靜的錯,所以驗收只能靠對照公告表。

對照公告表,58 級全部比一遍

健保的 115 年投保金額分級表有 58 級。我把公式(投保金額 × 5.17% × 30%,四捨五入,眷屬每人各一份)對每一級的本人、加 1 眷口、加 2 眷口、加 3 眷口金額,另外雇主負擔(× 60% × 1.56 人)都比一遍:全部一致。2026-10-04 重跑的結果:

投保金額 健保本人 本人加 3 眷口 勞保+就保(勞工負擔)
29,500 458 1,832 738
30,300 470 1,880 758
45,800 710 2,840 1,145
150,000 2,327 9,308 不適用(勞保最高 45,800)
313,000 4,855 19,420 不適用

要老實講的限制:這張對照表是別人轉載的公告表,我沒有直接打開健保署和勞保局的附件檔。健保署頁面從我這邊回 403,所以 check-urls.py 把 nhi.gov.tw 加進「已知會擋雲端 IP」清單,降成 WARN。勞保那一欄只拿 738、758 兩個轉載值核對過,45,800 的 1,145 是公式算出來的,沒有對照表,也沒有全表比對。

150,000 那一級差 1 元:round 的陷阱

58 級裡只有一級不一致,不是技能的公式錯。我寫技能時就用了 Decimal,但驗證腳本裡順手拿 Python 內建 round 當對照,結果這一級對不上:

from decimal import Decimal, ROUND_HALF_UP

base = 150000
raw = base * 0.0517 * 0.3
print(raw, round(raw))
exact = Decimal(base) * Decimal('0.0517') * Decimal('0.3')
print(exact, int(exact.quantize(Decimal('1'), rounding=ROUND_HALF_UP)))

2026-10-04 實測輸出:

2326.5 2326
2326.50000 2327

剛好是 .5 的時候,round 取偶數(2326),公告表是四捨五入(2327)。29,500 那級的勞保 737.5 湊巧也是取偶數得到 738,所以其他級都沒露餡。技能裡的程式一直是 Decimal 加 ROUND_HALF_UP,並且有一條 assert premiums(150000)['health'] == 2327 擋住這件事。如果當初直接用 round,這個斷言會是紅的。

另外三項沒做,原因都是驗證不了

  • 國道即時路況:tisvcloud.freeway.gov.tw 從我的環境連線逾時,連回應都拿不到
  • 圖書館館藏:臺北市立圖書館的查詢系統是 JavaScript 頁面,我沒找到穩定又免金鑰的 API;國家圖書館的 ISBN 搜尋只有書目資料,沒有各館有沒有書、能不能借
  • 台南、高雄、桃園垃圾車:台南的下載主機 soa.tainan.gov.tw 和高雄的 data.kcg.gov.tw 從我這邊 curl 回 000,桃園我沒找到可下載的網址

這是我這個環境連不上,不等於網站掛了。但這個倉庫的規則是只收實測過的來源,連不上就不能寫「已支援」,所以 roadmap 上這幾項維持沒打勾,國道那一行註明了原因。

來源

  • 115 年度綜合所得稅公告:https://gazette.nat.gov.tw/EG_FileManager/eguploadpub/eg031224/ch04/type3/gov30/num12/Eg.pdf
  • 勞保投保薪資分級表:https://www.bli.gov.tw/0005475.html
  • 這次的 CHANGELOG 在倉庫的 CHANGELOG.md,版本 0.9.0

上一篇
【Day 26】37,133 變 37,175,CI 紅了四天:我修好的檢查,自己又誤報一次
下一篇
【Day 28】排程寫 12:17 UTC,26 次實測都晚了 3.2 到 7.4 小時才跑
系列文
30 天養大一個開源專案:baodao-skill 從零開始 共 29 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言