数学计算 本地计算 开箱即用 内置示例 不留痕迹

百分比变化计算器

四种模式覆盖百分比变化的全部常见问法:从起始值到结束值涨跌了百分之几、原值增减一定比例后是多少、由变化后的值反推原值、以及多期复合增长率。

「涨了百分之几」是报表和作业里最高频的算术,却也是错得最多的:跌两成之后要涨多少才能回本?答案不是两成。四个方向都备好了——算变化率、按比例增减、倒推原值、多年复合增长,股价、汇率、销售额的变化一次算清。

最反直觉的是「涨跌不对称」:从 100 跌到 80 是跌 20%,但从 80 涨回 100 要涨 25%——分母变了。复合增长率(CAGR)按几何平均算((末值/初值)^(1/年数) − 1),别用算术平均把各年增长率加起来除。

使用步骤

  1. 选模式:变化率 / 求变化后 / 反推原值 / 复合增长率。
  2. 变化率模式填起始与结束值,看涨跌幅(负为跌)。
  3. 反推模式填变化后与变化率,还原原值。
  4. 复合增长率填初值、末值与年数,看年均增速。

计算原理与示例

四种模式怎么选

「变化率」算从起始值到结束值的涨跌幅;「增减后」算原值增减一定比例的结果;「反推原值」由变化后的值与幅度倒推原始值;「复合增长」算多期里平均每期增长多少。切换模式后输入框会自动换成该模式需要的字段。

变化率怎么算

变化率 =(结束值 − 起始值)÷ |起始值| × 100%。用绝对值作分母是为了让方向只体现在正负号上:从 −100 到 −50 属于上涨 50%,而不是下降。

什么情况需要反推原值

「反推原值」常用于核对账单:如果商品涨价 15% 后是 230 元,用 230 ÷ 1.15 得到原价 200 元。直接对 230 乘 85% 得到 195.5 是错的,这是最常见的百分比误用。

复合增长率与平均增长率的区别

复合增长率按每期同样的比例推算:每期增长率 =(末期 ÷ 期初)^(1 ÷ 期数) − 1。它与「总增长 ÷ 期数」的算术平均不同,因为每期收益会滚入下一期本金。

代码示例

JavaScript 四种模式一个函数

const pctChange = (from, to) => (to - from) / Math.abs(from) * 100;
const applyPct = (v, p) => v * (1 + p / 100);
const reversePct = (after, p) => after / (1 + p / 100);
const cagr = (begin, end, years) =>
  (Math.pow(end / begin, 1 / years) - 1) * 100;

pctChange(100, 80);        // -20(跌 20%)
reversePct(80, -20);       // 100
pctChange(80, 100);        // 25(涨回要 25%)
cagr(100, 121, 2);         // 10(年均 10%)

Python 同四模式的 Python 版

pct_change = lambda a, b: (b - a) / abs(a) * 100
apply_pct = lambda v, p: v * (1 + p / 100)
reverse_pct = lambda after, p: after / (1 + p / 100)
cagr = lambda b, e, y: ((e / b) ** (1 / y) - 1) * 100

pct_change(100, 80)    # -20.0
cagr(100, 121, 2)      # 10.0

常见问题

变化率为什么要除以起始值的绝对值?

这样方向只由分子(结束值 − 起始值)的正负决定,分母始终为正。举例:从 −100 到 −50,数值是变大(上涨),若用带符号的 −100 作分母会算出 −50%,看起来像下跌,与直觉相反。

反推原值什么时候用得上?

凡是「看到加价后的价格、想还原原价」的场景都适用,比如打折标签写着「已涨价 15%,现价 230 元」。注意不能用「现价 × (1 − 15%)」来还原,那样得到 195.5;正确做法是 230 ÷ 1.15 = 200。

复合增长率和平均增长率有什么区别?

平均增长率是「总增长 ÷ 期数」的算术平均,忽略了复利滚动;复合增长率(CAGR)是几何平均,假设每期按同一比例增长。100 元两年涨到 200 元,算术平均是每年 50%,但实际每年只需 41.42%,因为第二年的基数已经变大。

先涨 100% 再跌 50%,为什么回到原价?

因为涨跌的基数不同:100 涨 100% 到 200,再从 200 跌 50% 回到 100。百分比变化永远相对「当前那个基数」计算,涨跌幅度相同并不代表相互抵消,这也是「先跌 50% 再涨 50% 只回到 75%」的原因。

起始值为 0 为什么算不出变化率?

变化率的分母是起始值,0 不能作分母。从 0 增长到任何数值,变化率在数学上都是无穷大,没有意义。这种情况请改用「增减后」模式,或用绝对变化量来描述。

百分比可以填负数吗?

可以。「增减后」与「反推原值」模式下,正数表示增加、负数表示减少,例如填 −15 就是降价 15%。但 −100% 会让反推的分母变成 0,此时会提示除数不能为 0。

结果保留几位小数?

按 10 位有效数字显示并自动去掉浮点尾差,所以 200 涨 15% 显示 230 而不是 229.99999999999997。需要更多位数时,可以点结果右侧的复制按钮取原始数值。

这里的计算会把价格和营收数据上传吗?

不会。所有运算由浏览器本地脚本完成,服务器只发送页面本身;页面也不会把输入写进任何云端接口。计算历史仅保存在你自己浏览器的 localStorage,点历史区「清空」即可删除。

延伸阅读

来自本站原创文章,讲清这个工具背后的算法与口径。