同一台車的平均油耗,Futari 曾經有兩種算法
Futari 是兩個人一起記生活帳的家計簿。除了錢,它也幫你記家裡一起照顧的東西:房子、車、保險、孩子、寵物、植物,我叫它們「愛物」。車子那一頁可以記每次加油,Futari 會幫你算出這台車平均一公升跑多遠。
九月中,我在整理油耗這段程式時,發現同一個平均油耗,Futari 裡寫了兩份。
兩份長得很像,放在不同地方,各自給不同的畫面用。我原本只想把它們合成一份,以後改一個地方就好。合到一半才看清楚,這兩份連算法都不一樣。
一份是把每次加油算出來的油耗加起來,再除以加油次數。另一份是拿總里程除以總油量。每次加的油差不多、跑的路也差不多時,兩個答案很接近;只要哪一次加得特別多或特別少,兩邊就會給出明顯不同的數字。
兩種算法都說得通,所以兩份程式都能跑、都沒報錯,各自看起來都對。只有擺在一起比,才看得出它們在回答不同的問題。
我最後選了總里程除以總油量。使用者想知道的,是這台車實際上一公升能跑多遠,這個算法回答的就是這件事,也不會因為某一次只加了一點點,整個平均就被拉走。
合併的時候還發現一件小事:同一天加了兩次油,兩筆紀錄的先後順序每次查出來都可能不同,依賴這個順序的計算也跟著飄。補上一個固定的排序規則,才穩下來。
隔天又冒出一個舊問題。有台車很久沒加油,畫面卻一直說「需要至少 2 次加油記錄才能顯示平均油耗」。這句話是錯的,那台車的加油紀錄早就不只兩次,只是最近沒有新的。程式真正在意的是「最近有沒有紀錄」,問出口的卻是「總共夠不夠兩筆」,兩個問題長得很像,答案完全不同。現在久沒加油的車,不會再看到這句話了。
我以前覺得,同一段計算寫兩次,代價就是以後要改兩個地方。這次才知道還有更麻煩的:兩份可能早就悄悄變成不同的東西,而且誰都不會報錯。像「平均」這種聽起來只有一個答案的數字,其實有好幾種合理的算法,合併之前,得先決定要用哪一種。
家裡有車、油錢又是兩個人一起出的話,可以到作品集找 Futari,把加油紀錄記進去看看。
先不說了,我得去看看其他跟「平均」有關的數字,是不是也藏著兩種算法。
這段 code 寫於 2026 年 9 月 13 日,文章整理於 2026 年 10 月。