百分比計算機

五種問法,一頁解決,而且每次都把算式攤開。

本機處理

X 的 P% 是多少?

200 的 15% 是 30

30

這個答案是怎麼算出來的

  1. 先把百分比變成一般的數15% = 15 ÷ 100 = 0.15
  2. 再乘上基數0.15 × 200 = 30
  • 剩下的 85%170

完全在你的瀏覽器裡執行 —— 打開開發者工具的 Network 分頁就能驗證

先選你真正想問的是哪一種問題,填兩個數字,答案會連同算出它的每一步一起出現。整段運算都在你自己的裝置上跑完,資料一步都沒有離開過 —— 這麼小的一段算術,本來就沒有理由跑到別人的機器上。

一個詞底下藏著五個不同的問題

有人說「幫我算一下百分比」的時候,可能指的是五件不同的事,而它們的答案彼此不能互換。第一種是大多數人腦中的畫面:某個量的一部分。200 的 15% 是 30。第二種方向相反 —— 你手上有兩個量,想知道其中一個佔另一個多少。200 裡的 25 是 12.5%。

第三種是隨時間的變化。原本 40、現在 50,值得講的是那個上升的 25%。第四種是套用一個你已經知道的變化:1200 加上 20% 之後是多少。第五種幾乎沒有人會明講出名字 —— 兩個數字之間的差距,而且其中沒有一個算是「原本的那個」。用這種算法,30 與 50 相差 50%,那跟「30 成長 66.7% 變成 50」不是同一句話。

大多數計算機把其中三種放在同一頁、擺成三組沒有標題的輸入框,然後讓你自己判斷該用哪一組。錯誤通常就發生在那一步,不是發生在算術上。所以這一頁在你打任何數字之前,先把每一種問法的完整問句寫出來,並且在結果旁邊給你一句填好數字的完整句子,讓你可以核對「這個答案回答的是不是我想問的那題」。

跌下去再漲回來,需要的百分比比較大

100 加 50% 是 150。從 150 減 50% 會落在 75,不是回到 100。這兩個動作看起來對稱,其實不是,因為第二次是拿一個比較大的數當基準。寫成通式:先漲 p%、再跌 p%,最後會停在原本的 1 −(p/100)²,而那個值永遠小於 1。

同樣的不對稱也出現在報告裡。一個數字從 100 掉到 80,是跌 20%;要回到 100 則是漲 25%。兩句話描述的是同樣那 20 個單位的移動,而且兩句都正確,因為變化百分比的分母永遠是「你從哪裡出發」。引用其中一個數字、卻讓人以為是另一個,是百分比最常見的誤導方式,而且做這件事的人一句謊都不必說。

這一頁在每一次算變化的時候,都會把反方向的數字一併列出來,就是為了讓這個不對稱看得見,而不是要你自己記得。跌掉 50% 要漲 100% 才回得來;跌掉 90% 要漲 900%。

百分點不是百分比 —— 台灣新聞最常混用的一組詞

利率從 2% 升到 3%,是上升「1 個百分點」,同時也是上升「50%」。這兩句都是對同一件事的真話,只是用了兩個不同的單位;而把其中一個換成另一個,這件事的規模會差 50 倍。

規則講出來其實很簡單:兩個百分比相減,得到的單位是百分點;兩個百分比相除,得到的才是百分比。民調支持度從 40% 變成 50%,是增加 10 個百分點,也是支持度成長 25%。兩個數字都值得知道,但它們回答的是不同的問題。

這不是罕見的咬文嚼字。台灣的財經與政治新聞裡,利率、失業率、民調、稅率級距的報導幾乎每週都在混用這兩個詞,而混用的方向幾乎一律是把事情講得比較大。看到不確定的說法時,把兩個數字相減,看看得到的是不是報導引用的那個數 —— 一次就分得出來。

打八折不是減八成:中文的折扣說法方向是反過來的

中文的「折」講的是「付多少」,英文的 off 講的是「少付多少」,兩者方向相反。「打八折」是付原價的 80%,也就是折抵 20%,對應的英文是 20% off 而不是 80% off。習慣之後不會弄錯,但在對照國外購物網站、或是把中文文案翻成英文的時候,這個方向翻轉每年都在製造真實的價差爭議。

折扣疊加則是另一件事,而且中英文都一樣會錯。「先打八折、結帳再打九折」不是打七二折那麼簡單的相加問題 —— 它確實是 0.8 × 0.9 = 0.72,也就是打七二折,但如果換成「折 20% 再折 10%」的說法,很多人會直覺算成折 30%,實際上只折了 28%。兩個折扣疊起來,永遠比它們相加來得少。

常見的商場說法也可以用同一把尺量:「買一送一」等於打五折;「第二件六折」是兩件總價 1.6 倍除以 2,等於打八折;「滿千送百」如果是折價券而不是現金折扣,實質折扣還要看那張券後來有沒有用掉。把每一種說法都換算成「乘以多少」,這些話術就會回到同一個平面上比較。

台灣的標價是含 5% 營業稅,所以稅額不能用乘的

台灣的零售標價與統一發票金額都是含稅價,這一點跟美國的稅外加不一樣,也是最常見的百分比算錯來源。一張 105 元的發票,裡面的營業稅並不是 105 × 5% = 5.25,而是先把含稅價還原:105 ÷ 1.05 = 100 是未稅金額,稅額就是剩下的 5 元。用乘的每次都會高估,而且稅率越高差越多。

為什麼會這樣:5% 這個百分比是加在「未稅金額」上的,不是加在含稅金額上。所以要反推回去只能用除的。同一個道理適用於所有「已經內含某個百分比」的價格 —— 含服務費的餐飲帳單、含手續費的成交金額、含運費的到手價,全部都是除以 1 + 費率,不是乘以費率。

這一頁的「A 是 B 的百分之幾」可以直接處理你已經同時知道兩個金額的情況;而「加減百分比」那一種問法底下的「要還原回去需要」那一行,講的正是同一件事的另一面 —— 加了 20% 之後要回到原點,需要的不是減 20%,是減 16.67%。

算術本身會在哪裡安靜地出錯

電腦用二進位存小數,而十進位小數大多換不成長度有限的二進位,就像三分之一在十進位裡寫不完一樣。這就是為什麼直接算某個價格的 10%,有時候會跑出一長串小數、最後多一個 4。誤差小於一千兆分之一,對答案完全沒有影響,但出現在一個宣稱「把算式攤開給你看」的頁面上就很刺眼 —— 所以這裡的結果在顯示之前會先收斂到 12 位有效數字:遠比任何真實問題需要的精度還多,也遠低於那串雜訊出現的位置。

四捨五入是另一個陷阱。一張明細如果每一行先四捨五入再加總,跟先加總再四捨五入一次,得到的數字會不一樣。這就是為什麼稅務機關會明文規定要用哪一種,而不是交給軟體自己決定。兩種做法在抽象上沒有誰比較正確,它們是兩種不同的口徑;兩個系統對不起來的時候,通常是這個原因而不是程式有 bug。

最後一種是真正的精度流失。超過大約九千兆的數字,瀏覽器已經沒辦法精確表示,超過之後最後幾位就變成近似值。這個門檻遠遠超出任何人真的會拿來問百分比的數字,但你如果真的打了那麼大的數,這一頁會直接說出來,而不是把一個近似值當成事實給你。

計算機沒有理由需要一台伺服器

這個站上的每一個工具都跑在你自己的裝置上。對檔案轉換來說,那是一句有份量的隱私主張 —— 你的合約、你的護照掃描檔,真的一次都沒有離開過這台機器。但對一個百分比計算機來說,同一句話的誠實版本要小得多,而且應該直接講清楚,不必包裝:兩個數字加一個百分比,本身並不敏感。

值得講的是另外一半。把「15」和「200」送到一台伺服器、等一趟來回、再收到「30」,對一次乘法來說是荒謬的機械量 —— 而這是相當多計算機網站到今天還在做的事,因為一次會碰到伺服器的頁面載入,就是一次可以被記錄、被再行銷、被變現的頁面載入。這裡的算術是幾行 JavaScript,跟頁面一起下載完就在你手上:把網路拔掉照樣算得出來,答案在你打完字之前就出現,而且不必排隊。

想驗證的話大約十秒就夠:把瀏覽器的網路檢視器開著放在旁邊,然後改掉其中一個數字。請求清單的長度一條都不會增加,因為另一端根本沒有一個可以被請求的地方。

常見問題

為什麼要把算式攤開,不是直接給答案就好?

因為單獨一個答案沒有辦法核對。結果看起來怪怪的時候,你分不出來是自己打錯數字、選錯問法,還是程式真的有問題 —— 而百分比這三種可能裡,選錯問法遠遠是最常見的那一種。看到「0.15 × 200 = 30」這一行寫在那裡,掃一眼就確定了。

差異百分比跟變化百分比差在哪裡?

這兩題問的東西不一樣,答案自然也不一樣。變化百分比的分母是起始值,而且有方向:40 到 50 是 +25%,50 到 40 是 −20%。差異百分比的分母是兩個數的中點,所以把兩個輸入對調會得到同一個答案。當其中一個數字確實是「原本的那個」時用變化百分比;當兩個都不是(例如比較同一件事的兩次量測)時用差異百分比。

打折之後要怎麼算回原價?

要用除的,不是把同一個百分比加回去。打八折之後的價格是原價的 0.8 倍,所以原價是折後價除以 0.8,等於漲 25% 而不是漲 20%。「加減百分比」那一種問法底下的「要還原回去需要」直接就是這個數字。

百分點到底是什麼?

它是兩個百分比相減之後得到的單位。從 2% 升到 3%,是上升 1 個百分點,同時也是上升 50%。百分比用除法比較,百分點用減法比較;該講百分點的時候講成百分比,是把一個小變化說得很大的標準手法。

輸入框可以打 1,234.5 或 15% 嗎?

可以。千分位逗號、尾巴多打的百分號、中文輸入法沒切回半形的全形數字、以及前後的空白,全部都讀得懂並且會被忽略。真的不是數字的東西則會得到一句白話說明,而不是靜靜地被當成 0 —— 後者才是讓人相信一個錯誤答案的原因。

含稅金額要怎麼反推稅額?

用除的。台灣的標價與發票金額都內含 5% 營業稅,所以 105 元的發票裡稅額是 105 ÷ 1.05 = 100(未稅),剩下的 5 元才是稅,不是 105 × 5% = 5.25。任何「已經內含某個百分比」的金額都一樣,要除以 1 + 費率。

計算實際上在哪裡執行?

在你自己的裝置上,用的是跟頁面一起下載下來的 JavaScript。沒有 API 呼叫,也沒有任何伺服器端的計算 —— 這就是為什麼結果會隨著你打字即時更新,也是為什麼把網路整個關掉這一頁還是能用。