20000mAh 的充电宝能带上飞机吗?按 Wh 算一遍,5 个容量档实测

20000mAh 的充电宝,航班上的额定能量是 74Wh,不是 100Wh。
差的那 26Wh,来自你乘的电压。
民航查的从来不是 mAh,是 Wh。
决定能不能带上飞机的,是「容量 × 电压 ÷ 1000」这一步。
我把这条规则写成了一个单文件网页,双击就能开,不联网,不引第三方库。
下面每个数字都能在页面上改两个输入框复算出来。
一、为什么值得看:100Wh 是条换算出来的线,不是容量线
民航局的规则是三档。
额定能量不超过 100Wh,随身携带,不需要批。
超过 100Wh 但不超过 160Wh,得航空公司批准,而且每人只能带 2 个。
超过 160Wh,禁止随身也禁止托运。
麻烦在于铭牌上印的是 mAh,规则用的是 Wh。
按常见的电芯电压 3.7V 算,100Wh 大约是 27027mAh。
所以 20000mAh 那类充电宝,74Wh,离红线还差 26Wh。
27000mAh 标称的正好是 99.9Wh,几乎贴着线站。
要是换成输出电压 5V 去乘,20000 × 5 ÷ 1000 = 100Wh,凭空多出 26Wh。
同一个充电宝,一个算法说可随身,另一个算法说卡在红线上。
这就是我把这个页面做出来的原因:把口径摆在明面上。
顺手说一句在机场被问爆的另外两条。
充电宝严禁托运,只能随身。
标识不清、标不出额定能量又算不出来的充电宝,直接不让带。
2025 年 6 月 28 日起,境内航班还多了一条:没有 3C 标识、3C 标识不清晰、以及被召回型号或批次的充电宝,一律禁带。
二、这个工具做了什么
需求一句话就交代完了:做一个「充电宝能不能带上飞机」的查询页,输入 mAh 和 V 实时算 Wh 并判定,内置常见容量档,把计算过程、对比图和自查清单都放上去。
页面上有四块。
第一块是输入与判定,两个输入框加一排快捷档位,下面立刻给出结论和五步计算过程。
第二块是条形图,把 5000 到 30000 mAh 五个档位按 3.7V 算出的 Wh 并排放,图上插着 100Wh 和 160Wh 两条红线。

第三块是口径对照表,把「按电芯 3.7V 算」和「误按输出 5V 算」两列结果并排放在一起。

第四块是乘机自查清单,六项,带勾选进度条。
判定函数就三行,规则本身没有歧义:
function judge(Wh){
if(Wh<=100) return {cls:"v-ok", title:"✅ 可随身携带", desc:"额定能量 ≤100Wh,可随身携带,无需特别申报。"};
if(Wh<=160) return {cls:"v-warn", title:"⚠ 需航空公司批准", desc:"100Wh < 额定能量 ≤160Wh,须经航空公司批准,且每人限带 2 个。"};
return {cls:"v-bad", title:"🚫 禁止携带", desc:"额定能量 >160Wh,禁止随身或托运携带。"};
}
真正容易错的不是这三行,是喂给它的那个 Wh 是怎么算出来的。
三、实测:五个容量档,12 组用例
五个档位按 3.7V 算出来的结果放在一张表里。
| 额定容量 | 按 3.7V 算 | 判定 | 误按 5V 算 | 5V 口径下的判定 |
|---|---|---|---|---|
| 5000 mAh | 18.5 Wh | 可随身 | 25.0 Wh | 可随身 |
| 10000 mAh | 37.0 Wh | 可随身 | 50.0 Wh | 可随身 |
| 20000 mAh | 74.0 Wh | 可随身 | 100.0 Wh | 可随身 |
| 27000 mAh | 99.9 Wh | 可随身 | 135.0 Wh | 需批准 |
| 30000 mAh | 111.0 Wh | 需批准 | 150.0 Wh | 需批准 |
表格里有两处值得一提的细节。
20000mAh 那一行,按 5V 算是 100.0Wh,判定仍然是「可随身」,因为规则原文写的是「超过 100Wh 才需要批准」,100Wh 整正好还站在里面。
所以口径错的代价在这一行上不是判定翻转,是离红线的距离被抹掉了。
27000mAh 那一行就是真的翻车:99.9Wh 本来贴着线站,按 5V 算成 135.0Wh,直接掉进「需批准」。
我把输入组合逐条跑了一遍,按规则原文核对判定结果。
| 输入(mAh,V) | 算出 | 页面判定 | 与规则一致 |
|---|---|---|---|
| 5000,3.7 | 18.50 Wh | 可随身携带 | 是 |
| 10000,3.7 | 37.00 Wh | 可随身携带 | 是 |
| 20000,3.7 | 74.00 Wh | 可随身携带 | 是 |
| 27000,3.7 | 99.90 Wh | 可随身携带 | 是 |
| 30000,3.7 | 111.00 Wh | 需航空公司批准 | 是 |
| 20000,5 | 100.00 Wh | 可随身携带 | 是 |
| 27000,5 | 135.00 Wh | 需航空公司批准 | 是 |
| 20000,5.2 | 104.00 Wh | 需航空公司批准 | 是 |
| 50000,3.7 | 185.00 Wh | 禁止携带 | 是 |
| 27027,3.7 | 99.9999 Wh | 可随身携带 | 是 |
| 27028,3.7 | 100.0036 Wh | 需航空公司批准 | 是 |
| 100000,3.7 | 370.00 Wh | 禁止携带 | 是 |
12 组全部对上,其中最后两条是拿来试边界的。
27027mAh 乘 3.7V 是 99.9999Wh,27028mAh 是 100.0036Wh,一个在线内一个在线外,判定也跟着换。
30000mAh 那档是页面里唯一一个需要批准的常见档位,截图里它是黄条。

四、验证与踩坑:空输入被判成了「可随身携带」
这个页面有一处真实的缺陷,我把它留在文章里。
把额定容量这一栏清空,不填任何数字。
页面的判定是绿色的「可随身携带」,计算过程第五步写着「0.00 Wh ≤100 → 可随身携带」。

也就是说,一个什么都没有的输入,会被它能算的最低能量值包装成合格结论。
最小复现:打开页面,把「额定容量(mAh)」输入框里的 20000 删掉,什么都不填。
根因是这段逻辑里少了一句校验。
const m=parseFloat($("mAh").value)||0; // 空值和 NaN 一律按 0 处理
const Wh=m*v/1000;
空字符串经 parseFloat 变成 NaN,再被 || 0 兜成 0,于是 0Wh 走进了「≤100Wh 可随身」这一档。
判定函数本身没错,错在它拿到的输入没被检查过。
这个 bug 的坏处不在数字上,在观感上:它给了一个肯定的绿色结论,而正确的做法应该是提示「请输入额定容量」。
我把这条连同另外三种输入一起列进失败路径对照表。
| 输入 | 页面表现 | 是否合理 |
|---|---|---|
| 容量清空 | 0.00 Wh,绿色「可随身携带」 | 不合理,应该提示输入为空 |
| 容量填 0 | 0.00 Wh,绿色「可随身携带」 | 不合理,0 不是有效容量 |
| 容量填 100000 | 370.00 Wh,红色「禁止携带」 | 合理 |
| 电压填 5(20000mAh) | 100.00 Wh,绿色「可随身携带」 | 数值正确,但这是输出口径不是电芯口径 |
第二处要如实说的是页面自己的一处口径不一致。
对照表下方那段注释写的是「20000mAh 误按 5V 算成 100Wh,会被误判为卡在 100Wh 红线上、需航空公司批准」。
但同一张表里,20000mAh 那一行的 5V 误判列是「可随身」。
两处对 100Wh 整用了不同的边界理解,表格按「超过 100Wh 才需要批准」判,注释按「够到 100Wh 就要批准」写。
按民航局公告原文「额定能量超过 100Wh 但不超过 160Wh,经航空公司批准后方可携带」,表格的判定是对的,注释那句措辞偏严了。
留着它比改掉它有用:这种「同一页里两处对同一条边界的理解不一样」的问题,靠看代码很难发现,得把值喂到边界上才暴露。
五、本地复现
源码在公开仓库,单文件,没有构建步骤:
https://atomgit.com/deli007/demo_park/tree/main/codearts-powerbank-flight-lab
下载后双击 index.html 就能用,或者起一个本地静态服务:
git clone https://atomgit.com/deli007/demo_park.git
cd demo_park/codearts-powerbank-flight-lab
python -m http.server 8080
想自己复核判定,就按第三节那张 12 组用例表逐行填进去对一遍。
27027 和 27028 这两个数字建议单独试,它们是 100Wh 在 3.7V 下的两侧。
六、准备环境:进入码道 Web
浏览器打开码道 Web 版:https://devcloud.cn-north-4.huaweicloud.com/chat?source=dmzntgwlb&sourcead=dmzntgwlb1&invitecode=INV-IXhxk5bwWx_qKSP1FcgSuiOEf6ruDXtjvLFiCH9nMs5dZGLapaSSylwt-cKRj5LoT3MlxikWxy8VhqplfvtQjefQOq31Tbp3R3wYP3K535Cn4XTaUzqqExKPYTWvvw4LijV14IS1torXdTGp7oyXb6SR5VxgYTg50jM,登录后就能在对话窗口里输入需求,不需要装软件。
码道有三种使用方式:WebUI(浏览器对话)、TUI(终端命令行)和桌面 IDE(IDE 插件)。本文用的是 WebUI 版。
这轮发给它的需求是完整的一段:
做一个单文件网页工具,输入额定容量 mAh 与电芯电压 V 实时算出额定能量 Wh 并判定能否带上飞机,内置 5000 到 30000 mAh 五个快捷档位,把计算过程分步展示,用条形图把各档位和 100Wh、160Wh 两条红线画在一起,再做一张 3.7V 与 5V 的口径对照表和一个自查清单。
这段需求里有三句话是刻意加的。
一句是「按民航局规则判定,并写清三档的阈值」,把判定依据钉死。
一句是「做一张口径对照表,说明 20000mAh 用 5V 算会把 74Wh 误算成 100Wh」,等于把最容易错的那个点直接写进需求。
还有一句是「完成后打开预览,让我直接看到运行效果」,省掉了来回问「怎么跑」。
七、使用码道体会
- 规则类需求要把阈值写进需求里。我只说了「按民航局规则判定」,出来的三档阈值就得我自己核对一遍;把 100 和 160 直接写进去,验收成本立刻降一半。
- 把自己知道的坑写成需求,比事后改代码省事。「用 5V 算会误算」这句让对照表和注释一开始就有了,虽然那句注释的措辞后来发现偏严。
- 交付后按输入框逐个试边界,比看代码有效。空输入这个缺陷是清空输入框试出来的,读那几行 JS 时并不觉得有问题。
- 凡是「用户可能不填」的输入,都要在需求里点名要校验提示。这次没点名,页面就真的没做。
- 让页面把中间步骤显示出来。这个页面的五步计算过程既是给用户的,也是给我自己复核用的。
八、总结
充电宝能不能带上飞机,答案在 Wh 上,而 Wh 是算出来的,所以真正决定结论的是你用哪个电压去乘。
按电芯 3.7V 算,20000mAh 是 74Wh,可随身;30000mAh 是 111Wh,要航空公司批准且每人限 2 个。
按输出 5V 算,20000mAh 会变成 100Wh,27000mAh 会从 99.9Wh 变成 135Wh 并翻转判定。
规则本身有三档、有一条禁托运、还有 2025 年 6 月 28 日起的 3C 标识要求,页面上都摆着。
最后提醒一句:本文的结论按民航局公告原文和常见电芯电压推导,实际执行以航空公司和安检现场为准;Wh 认不出来的充电宝,安检有理由直接拦下。
浙公网安备 33010602011771号