AA 制听起来简单——总价除以人数。但稍微复杂一点的场景就有争议:有人没喝酒、有人代付、共享菜怎么算、临时加入的人算不算。AA 算不准的核心是没明确规则——把规则前置说清楚,分账工具只是把规则机械地执行。
三种主流分账模型
| 模型 | 计算 | 适用 | 不适用 |
|---|---|---|---|
| 均分 | 总额 / 人数 | 朋友聚餐、消费接近、不计较 | 消费差异大、有人不喝酒 |
| 按消费 | 各人消费 + 共享菜分摊 | 同事 AA、消费档次差异大 | 太抠门、伤感情 |
| 混合 | 部分共享均分 + 个人项目单算 | 旅游、长期合住、复杂场景 | 简单一顿饭就别整这个 |
选择口诀:人数 ≤ 4 朋友局 → 均分省事;同事 / 不熟群 / 含酒水 → 按消费 + 酒水单算;旅游 / 多日 → 混合模型 + 工具记账。
模型 1:均分
最简单也最常用:
总额 = 1200 元
人数 = 8
人均 = 1200 / 8 = 150
优点:算得快,不伤感情,体现”我们是朋友” 而不是”算账伙伴”。
坑:
- 有人只点了 50 元,付 150 → 心里不平衡
- 不喝酒的人替喝酒的人买单
- 有人吃饱了再点几个菜”大家分”——本质是让大家给他买单
- 朋友突然变多人聚会(5 人变 10 人),点单的人原本计划被打破
实务:均分前问一句”今晚酒水单算还是均分?“——这一句话能避免 80% 事后扯皮。
模型 2:按消费
A 点了:菜 80 + 酒 100 = 180
B 点了:菜 60 = 60
C 点了:菜 90 + 饮料 30 = 120
D 点了:菜 70 = 70
共享:锅底 + 米饭 + 服务费 = 80(4 人分摊 → 每人 20)
A 付:180 + 20 = 200
B 付:60 + 20 = 80
C 付:120 + 20 = 140
D 付:70 + 20 = 90
合计 = 200 + 80 + 140 + 90 = 510 ✓
优点:公平精确,不喝酒 / 不吃肉的人不亏。
坑:
- 算账麻烦——每个人点了什么得记清楚
- 共享菜的边界——锅底是共享,但凉菜呢?
- 有人多吃别人的(“你点的好吃我尝一筷子”)→ 严格说要算,实际不算
- 显得抠门——朋友局用这个会被吐槽”这么计较”
实务:用工具记账。点单时让一人不动手吃但只动手记——结账时一目了然。或拍菜单截图 + 标注。
模型 3:混合(旅游、长期场景)
旅游 AA 必须用混合模型——因为:
共享支出(必须分摊):
- 油费、过路费、停车费
- 房费(共享房间)
- 共享餐饮(酒店早餐、火锅)
个人支出(自付):
- 个人房间升级费
- 个人手信、纪念品
- 不参加的项目门票
- 个人特殊餐饮(不吃辣的单独点的菜)
记账模板:
| 日期 | 项目 | 金额 | 付款人 | 参与人 | 类型 |
|---|---|---|---|---|---|
| 4/22 | 高速过路 | 120 | 张三 | A,B,C,D | 共享 |
| 4/22 | 加油 | 300 | 张三 | A,B,C,D | 共享 |
| 4/22 | 住宿 4 间 | 1200 | 李四 | A,B,C,D | 共享 |
| 4/22 | 单人房升级 | 200 | 王五 | C | 个人 |
| 4/22 | 晚餐 | 400 | 张三 | A,B,C,D | 共享 |
| 4/23 | 早餐 | 200 | 李四 | A,B,C,D | 共享 |
| 4/23 | 景区门票 | 360 | 王五 | A,B,C | 共享(D 不去) |
| 4/23 | 纪念品 | 88 | 王五 | C | 个人 |
按这个表清算,每人净额一目了然。
最少转账数的算法
经典场景:1 人代付,其他人转给他。
张三代付 1200 元
4 人均分 → 每人 300
B/C/D 各转 300 给张三 → 3 笔转账
但更常见的是多人都垫付了一部分:
张三代付 500(应付 200,净 -300)
李四代付 700(应付 200,净 -500)
王五代付 0(应付 200,净 +200)
赵六代付 0(应付 200,净 +200)
朴素方案:王五转 100 给张三 + 王五转 100 给李四
+ 赵六转 100 给张三 + 赵六转 100 给李四
→ 4 笔
优化方案:王五转 200 给李四 + 赵六转 200 给李四
+ 李四不需要转给张三(让一些抵消)
其实更优:
王五转 200 给李四
赵六转 200 给张三
李四再转 100 给张三
→ 3 笔
贪心算法:把”欠钱”和”垫付”两组人按金额排序,欠最多的还给垫付最多的,依此类推。
function minTransfers(balances) {
// balances 是 { name: net } 对象,正数 = 欠钱、负数 = 多付了钱
const positive = Object.entries(balances).filter(([_, v]) => v > 0).sort((a, b) => b[1] - a[1]);
const negative = Object.entries(balances).filter(([_, v]) => v < 0).sort((a, b) => a[1] - b[1]);
const transfers = [];
let i = 0, j = 0;
while (i < positive.length && j < negative.length) {
const [from, owe] = positive[i];
const [to, paid] = negative[j];
const amount = Math.min(owe, -paid);
transfers.push({ from, to, amount });
positive[i][1] -= amount;
negative[j][1] += amount;
if (positive[i][1] === 0) i++;
if (negative[j][1] === 0) j++;
}
return transfers;
}
实务:人数 ≤ 5 手动算就行;6 人以上自动化避免漏。
共享菜 vs 个人菜的判定
共享菜:不吃也付费的——锅底、米饭、调料、服务费、餐位费、必点菜、看面子点的”硬菜”。
个人菜:明确归属某人的——单独点的酒水、个人主餐(牛排)、不吃辣的人单点的清淡菜、儿童餐。
判定原则:
- 是否所有人都吃到 → 是 → 共享
- 是否单点专属某人 → 是 → 个人
- 是否点单人明确说”我点这个,你们随意” → 是 → 个人
经典踩坑:
- A 点的”我自己吃” 的清蒸鱼,结果 B/C 也夹了——算共享还是个人?
- 理论上算个人(A 点的)
- 实际上:如果 A 没明说”自己吃”,鱼上桌就是大家的,算共享
- 解决:点单时明确”这道我自己吃”或”这道大家分”
- 服务费 / 包间费 → 全员均分,没争议
酒水的特殊处理
酒水是 AA 撕逼的最大来源:
| 场景 | 处理 |
|---|---|
| 全员喝酒 | 酒水均分给所有人 |
| 部分喝酒 | 酒水只分喝酒的人,菜品全员分 |
| 一人狂饮 | 酒水按消费量分(但很难精确) |
| 不能喝酒(孕妇、开车) | 一定不分摊酒水 |
| 喝得少 vs 喝得多 | 严格说按消费量,实际通常按”是否参与”算 |
实务建议:
- 开吃前定规则——“今晚酒水单算 / 菜品 AA”
- 点酒前问一句——“大家都喝吗?”
- 自己开瓶不喝就别开——开了不喝最尴尬
- 不喝酒的女生 / 司机 / 孕妇 → 默认不分摊酒水(多数地区共识)
实战场景对照
场景 1:朋友 5 人吃火锅
菜品:锅底 80 + 肉菜 400 + 蔬菜 120 + 主食 60 = 660
酒水:啤酒 200(4 人喝,1 人开车不喝)
服务费:50(5 人均分)
无酒水的开车人:660/5 + 50/5 = 132 + 10 = 142
喝酒的人:132 + 10 + 200/4 = 192
合计:142 + 192×4 = 910 ✓
场景 2:同事 8 人聚餐
总额 1600,含酒水 600。3 人不喝酒。
均分模式:每人 200(3 个不喝酒的吃亏 75)
按消费模式:菜品 1000/8=125,酒水 600/5=120
喝酒:125 + 120 = 245
不喝:125
合计:245×5 + 125×3 = 1600 ✓
不喝酒的人模式 1 比模式 2 多付 75 元——这就是”为别人买单” 的金额。同事 AA 应该用模式 2。
场景 3:4 人 3 天旅游
共享:油+过路 600 + 住宿 2400 + 餐饮 1800 = 4800
4 人均分 = 1200/人
个人:
A 单人房升级 200
B 景区门票(C/D 没去)120
D 纪念品 88
净额:
A 应付 1200 + 200 = 1400
B 应付 1200 + 120 = 1320
C 应付 1200 = 1200
D 应付 1200 + 88 = 1288
实付(看谁垫了多少):
张三(A)垫 2000
李四(B)垫 1500
王五(C)垫 700
赵六(D)垫 1008
合计 5208 ✓
净差:
A: 实付 2000 - 应付 1400 = +600(多付了 600)
B: 实付 1500 - 应付 1320 = +180
C: 实付 700 - 应付 1200 = -500(欠 500)
D: 实付 1008 - 应付 1288 = -280
转账方案:
C 转 A 500
D 转 A 100 + D 转 B 180
→ 3 笔解决
AA 工具该自动算什么?
好的分账工具应该处理:
- 多付款人 + 多参与人 的多笔记账
- 共享 vs 个人 的项目区分
- 酒水单算 的人头筛选
- 最少转账数 的自动求解
- 每人净额 的明细展示
- 结算单 一键生成 + 复制 / 截图
不需要的:
- 复杂的税费计算(餐饮 AA 不用算税)
- 货币转换(出国旅游另说)
- 长期账本(应该用专门记账软件)
实务清单
✅ 必做:
- 开吃前 1 分钟定规则——均分还是按消费?酒水算不算?
- 推举 1 人记账(最好不是付款的人)
- 当晚或次日清账,别拖
- 转账留截图凭证
- 共享菜 vs 个人菜在点单时就标记
❌ 避免:
- 边吃边算(注意力分散,遗漏)
- 事后改规则(“X 喝多了不公平”)
- 让记忆模糊的人独自记账
- 跨群混账(朋友局 + 同事局别混)
- 数额很小还要 AA(< 50 元的咖啡谁付都行)
AA 算不公平往往不是数学问题——是规则没说清和记账没做好。把这两件事前置,分账工具自动算最少转账,剩下的就是吃饭。