百分比变化计算器
四种模式覆盖百分比变化的全部常见问法:从起始值到结束值涨跌了百分之几、原值增减一定比例后是多少、由变化后的值反推原值、以及多期复合增长率。
「涨了百分之几」是报表和作业里最高频的算术,却也是错得最多的:跌两成之后要涨多少才能回本?答案不是两成。四个方向都备好了——算变化率、按比例增减、倒推原值、多年复合增长,股价、汇率、销售额的变化一次算清。
最反直觉的是「涨跌不对称」:从 100 跌到 80 是跌 20%,但从 80 涨回 100 要涨 25%——分母变了。复合增长率(CAGR)按几何平均算((末值/初值)^(1/年数) − 1),别用算术平均把各年增长率加起来除。
这个工具解决你的问题了吗?
提交后会把工具名、你的输入与当前结果发送到服务器;请勿填写身份证号、手机号等隐私信息。
AI 助手 会结合你当前的输入与结果回答
追问会再次把当前输入与结果发送到服务器;请勿填写隐私信息。
使用步骤
- 选模式:变化率 / 求变化后 / 反推原值 / 复合增长率。
- 变化率模式填起始与结束值,看涨跌幅(负为跌)。
- 反推模式填变化后与变化率,还原原值。
- 复合增长率填初值、末值与年数,看年均增速。
计算原理与示例
四种模式怎么选
「变化率」算从起始值到结束值的涨跌幅;「增减后」算原值增减一定比例的结果;「反推原值」由变化后的值与幅度倒推原始值;「复合增长」算多期里平均每期增长多少。切换模式后输入框会自动换成该模式需要的字段。
变化率怎么算
变化率 =(结束值 − 起始值)÷ |起始值| × 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,点历史区「清空」即可删除。
延伸阅读
来自本站原创文章,讲清这个工具背后的算法与口径。