毕业旅行红包雨
六人毕业旅行,最后一天结算时,小A垫付了全程住宿,小B付了所有门票,大家轮流请客吃饭。微信群里的红包发得乱七八糟,有人多抢了早餐钱,有人少付了景区观光车。用这个工具,把每一笔垫付的金额和对应的人名填进去,自动算出谁该给谁转多少钱,最后每人只发一个红包,清掉所有糊涂账,毕业不伤感情。
平均 AA · 余数分配:人均 = ⌊总额(分) ÷ 人数⌋,除不尽的余数(几分钱)从前往后每人多担 1 分,保证每人差不超过 1 分、合计精确等于总额。避免 100 ÷ 3 = 33.33×3 = 99.99 的丢分。
明细分账 · 净额:每人净额 = 已垫付 − 应分摊;所有人净额之和恒为 0(以分为整数运算,无浮点误差)。净额为正 = 应收回(别人欠你),为负 = 应支付(你欠别人)。
债务最小化结算:把净额分为债权(正)与债务(负)两组,反复用「最大债权人」与「最大债务人」相互抵消并记一笔转账,直到全部清零——以接近最少的转账笔数结清,远胜「人人互转」。
红包公平随机:每份保证 > 0,且各份之和精确等于总额(最后一份 = 总额 − 前面之和);随机模式用「二倍均值法」让金额有起伏又不为 0,等额模式则余数逐分派发。
提示:本工具所有金额以「分」为最小单位整数运算,合计始终精确。结算清单可直接复制发到微信群,照单转账即可两清。
饭局尾声,群里有人转了 328 元,备注“多退少补”,剩下的人对着账单猜谁该补多少。这个工具把总金额、人数和每个人已付或垫付的数额填进去,直接给出每人应收或应付的净额,支持按人头平摊、按比例分摊和红包随机分账三种模式。所有计算都在浏览器内完成,输入数据不会离开设备。
六人毕业旅行,最后一天结算时,小A垫付了全程住宿,小B付了所有门票,大家轮流请客吃饭。微信群里的红包发得乱七八糟,有人多抢了早餐钱,有人少付了景区观光车。用这个工具,把每一笔垫付的金额和对应的人名填进去,自动算出谁该给谁转多少钱,最后每人只发一个红包,清掉所有糊涂账,毕业不伤感情。
三室合租,室友A出差半个月,室友B天天在家开空调,室友C养猫多用了两倍的电。月底水电费单子来了,按人头平摊显然不公平。把每个人的入住天数、大功率电器使用情况折算成系数填进工具,选加权分摊模式,工具自动算出每人该付的精确比例,不再因为几十块钱闹别扭。
部门12人聚餐,结账时经理直接刷卡付了1280元。大家往群里发红包,有人发了100,有人发了80,有人只发了50。最后经理收了红包一算,总数差了210元,又不好意思挨个催。把每人实付金额和应付金额输进工具,工具自动列出谁欠谁多少,生成一个汇总表发群里,大家补上差额,经理不用当讨债人。
情侣出游一周,男生付了机票和酒店,女生付了餐饮和门票。回来后两人各自记账,男生记了8500,女生记了3200,但总觉得有一笔打车费重复算了。把各自记录的每笔金额、支付人和备注输入工具,工具自动合并去重,算出双方总支出差额,再按事先约定的分摊比例(比如男生60%女生40%)算出最终转账金额,省去翻聊天记录对账的麻烦。
春节家族群玩红包接龙,规则是抢到最少的人接着发。玩了十几轮,有人发了200,有人只发了20,还有人抢了就跑。群里吵成一团,谁也记不清谁欠谁。把每一轮的发包人和每个抢包人的金额录进工具,工具能按接龙规则自动核算出每个参与者最终的净支出或净收入,谁该补发多少钱一目了然,家族群恢复和谐。
| 维度 | 本工具 | 微信自带群收款 | 传统手工记账 |
|---|---|---|---|
| 隐私 | 纯浏览器计算,数据不上传服务器 | 需在微信内操作,数据经微信服务器 | 完全本地,但需人工记录 |
| 离线可用 | 页面加载后断网仍可计算 | 需联网使用 | 完全离线 |
| 算法灵活性 | 支持 AA、红包随机、自定义权重等多种分账模式 | 仅支持等额 AA,无随机或权重分账 | 依赖人工计算,灵活但易出错 |
| 多人场景效率 | 输入金额与人数,一键出结果 | 需逐人设置金额或等额分摊,操作步骤多 | 手动加总、除法、核对,耗时长 |
| 结果导出 | 支持复制结果文本,可粘贴到微信 | 结果仅限群内显示,无法单独导出 | 需手写或手动录入电子表格 |
| 红包公平分账 | 支持红包金额按规则公平分摊至个人 | 不支持 | 可手动计算但繁琐 |
| 平台依赖 | 任何浏览器打开即可用,无需安装 | 仅限微信 App 内使用 | 纸笔或任意设备均可 |
| 输入 | 输出 | 说明 |
|---|---|---|
| 总金额 500 元,人数 5 人,模式:随机红包 | 红包 1:98.23 元;红包 2:102.56 元;红包 3:95.47 元;红包 4:104.89 元;红包 5:98.85 元(合计 500.00 元) | 常规:验证随机红包金额之和等于总金额,且每人金额不同 |
| 总金额 100 元,人数 4 人,模式:AA 均分 | 每人 25.00 元(合计 100.00 元) | 常规:AA 均分场景,验证整除时金额精确到分 |
| 总金额 10 元,人数 3 人,模式:AA 均分 | 每人 3.33 元(合计 9.99 元,差额 0.01 元归最后一人) | 边界:金额无法整除,工具如何处理余数(通常归最后一人或随机分配) |
| 总金额 0.01 元,人数 2 人,模式:随机红包 | 红包 1:0.01 元;红包 2:0.00 元(合计 0.01 元) | 边界:最小金额场景,验证工具允许 0.00 元红包出现(符合微信红包规则) |
| 总金额 200 元,人数 200 人,模式:随机红包 | 红包 1:1.00 元;红包 2:1.00 元;……(共 200 个红包,合计 200.00 元,每人至少 0.01 元) | 边界:人数等于金额(元),验证每人至少 0.01 元且总额正确 |
| 总金额 100 元,人数 10 人,模式:AA 均分,但输入人数为 0 | 错误提示:人数必须大于 0 | 易错:人数为 0 时工具应给出明确错误,而非崩溃或返回空结果 |
| 总金额 -50 元,人数 5 人,模式:随机红包 | 错误提示:总金额必须为正数 | 易错:负数金额的校验,防止用户误输入 |
| 总金额 100 元,人数 3 人,模式:AA 均分,但输入人数为 3.5 | 错误提示:人数必须为整数 | 易错:非整数人数的处理,避免计算逻辑异常 |
1.总金额与人数不匹配,红包算法出现零元或负数
总金额 10 元,分给 11 人,每人至少 0.01 元总金额 10 元,分给 10 人,每人至少 0.01 元;或总金额 11 元,分给 11 人微信红包算法要求每人至少 0.01 元,总金额必须 ≥ 人数 × 0.01,否则随机分配时会因金额不足报错或出现零元红包。
2.金额单位混淆,把分当元输入
总金额输入 1000(实际想表达 10 元,但单位是分)总金额输入 10(单位明确为元)工具默认金额单位为元,若按分输入会导致实际分账金额放大 100 倍,造成账目混乱。
3.人数输入为 0 或负数,导致计算无意义
人数输入 0 或 -3人数输入 ≥ 2 的整数AA 分账至少需要 2 人,0 或负数在数学上无意义,工具应做前端校验拦截。
4.红包模式选错,把「随机红包」当「普通 AA」用
希望每人金额相等,却选择了「随机红包」模式选择「普通 AA」模式,或确认随机红包后再查看结果随机红包模式每人金额不同,若期望均分则结果与预期不符,需在操作前明确模式语义。
5.小数点后位数超过 2 位,导致金额精度丢失
总金额 10.123 元,分给 3 人总金额 10.12 元(保留两位小数)人民币最小单位为分(0.01 元),超过两位小数的金额无法在真实转账中使用,工具应自动四舍五入到分。
6.把微信群昵称当作真实姓名,分账后对不上人
在工具里用「张三-财务」作为分账人,实际微信昵称是「张三」使用微信昵称或真实姓名,确保与转账备注一致分账结果最终需在微信群内对账,昵称不一致会导致收款人找不到对应记录。
每人应付 = 总金额 ÷ 人数 + (红包金额 × 个人权重 ÷ 总权重)
总金额AA 总消费金额,单位元人数参与分账的总人数红包金额额外红包总金额,单位元个人权重每人红包分配权重,默认 1总权重所有个人权重之和4 人聚餐总消费 600 元,另发红包 40 元,权重均为 1(总权重 4)。每人应付 = 600÷4 + (40×1÷4) = 150 + 10 = 160 元。若其中一人权重为 2(总权重 5),则该人应付 = 150 + (40×2÷5) = 150 + 16 = 166 元,其余三人各付 = 150 + (40×1÷5) = 150 + 8 = 158 元。
6 种主流语言实现,复制即用:
from decimal import Decimal, ROUND_HALF_UP
# 多人 AA 分账:总金额按人数均分,处理分币尾差
def split_bill(total: str, n: int) -> list[str]:
total_cents = int(Decimal(total) * 100)
base = total_cents // n
remainder = total_cents % n
# 前 remainder 人每人多 1 分
amounts = [base + (1 if i < remainder else 0) for i in range(n)]
# 转换为元,保留两位小数
return [f"{Decimal(a) / 100:.2f}" for a in amounts]
# 示例:3 人分 100.01 元
print(split_bill("100.01", 3)) # ['33.34', '33.34', '33.33']// 多人 AA 分账:总金额按人数均分,分币尾差归前几人
function splitBill(total, n) {
const totalCents = Math.round(parseFloat(total) * 100);
const base = Math.floor(totalCents / n);
const remainder = totalCents % n;
return Array.from({ length: n }, (_, i) =>
((base + (i < remainder ? 1 : 0)) / 100).toFixed(2)
);
}
// 示例:4 人分 50.03 元
console.log(splitBill("50.03", 4)); // ['12.51', '12.51', '12.51', '12.50']package main
import (
"fmt"
"math"
"strconv"
)
// 多人 AA 分账:总金额按人数均分,分币尾差归前几人
func splitBill(total string, n int) []string {
f, _ := strconv.ParseFloat(total, 64)
totalCents := int(math.Round(f * 100))
base := totalCents / n
remainder := totalCents % n
res := make([]string, n)
for i := 0; i < n; i++ {
amt := base
if i < remainder {
amt++
}
res[i] = fmt.Sprintf("%.2f", float64(amt)/100)
}
return res
}
func main() {
fmt.Println(splitBill("100.01", 3)) // [33.34 33.34 33.33]
}#!/bin/bash
# 多人 AA 分账:总金额按人数均分,分币尾差归前几人
split_bill() {
local total="$1"
local n="$2"
# 转换为分
local total_cents=$(echo "$total * 100" | bc | sed 's/\..*//')
local base=$((total_cents / n))
local remainder=$((total_cents % n))
for ((i=0; i<n; i++)); do
local amt=$base
if (( i < remainder )); then
amt=$((amt + 1))
fi
printf "%.2f\n" $(echo "scale=2; $amt / 100" | bc)
done
}
# 示例:3 人分 100.01 元
split_bill "100.01" 3 # 33.34 33.34 33.33import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
public class AASplit {
public static List<String> splitBill(String total, int n) {
BigDecimal totalBD = new BigDecimal(total);
int totalCents = totalBD.multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).intValue();
int base = totalCents / n;
int remainder = totalCents % n;
List<String> result = new ArrayList<>();
for (int i = 0; i < n; i++) {
int amt = base + (i < remainder ? 1 : 0);
result.add(BigDecimal.valueOf(amt).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).toString());
}
return result;
}
public static void main(String[] args) {
System.out.println(splitBill("100.01", 3)); // [33.34, 33.34, 33.33]
}
}fn split_bill(total: &str, n: usize) -> Vec<String> {
let total_cents: i64 = (total.parse::<f64>().unwrap() * 100.0).round() as i64;
let base = total_cents / n as i64;
let remainder = total_cents % n as i64;
(0..n)
.map(|i| {
let amt = base + if i < remainder as usize { 1 } else { 0 };
format!("{:.2}", amt as f64 / 100.0)
})
.collect()
}
fn main() {
println!("{:?}", split_bill("100.01", 3)); // ["33.34", "33.34", "33.33"]
}支持。输入总金额和人数后,勾选「随机分配(红包模式)」,系统会按微信红包的逻辑生成随机金额,每人分到的钱不等但总和等于总金额。适合群里抢红包后记账、拼手气红包返现等场景。不勾选则默认均分,每人金额相同。
在「参与人数」里把 A 排除掉。输入总金额 100 元,参与人数选 3(B、C、D),然后勾选「指定垫付人」并填入 A 垫付 100 元。结果会显示 B、C、D 每人应付 33.33 元给 A,A 自己不用出钱。这个逻辑在聚餐、团建代买场景很常用。
这是金额四舍五入到两位小数造成的「分差」。比如 100 元分 3 人,每人 33.33,3×33.33=99.99,少了 1 分。本工具在结果区会标注「合计:100.00 元(已自动补差)」,差额会自动加到最后一个人头上,保证总和精确等于总金额。如果看到某个人金额多了一分,就是补差结果,不是算错。
本工具支持「多垫付人」模式。在总金额处填所有开销的合计(比如菜+肉+酒=300 元),然后在垫付明细里分别录入:A 垫付 100、B 垫付 80、C 垫付 120。系统会自动算出每个人最终应付/应收的净额,并生成一张「谁该转给谁多少钱」的清单,省去手动交叉抵消的麻烦。
可以。结果区下方有「复制结果」按钮,点击后会把每人应付金额整理成一段文本,格式像「张三 → 李四 33.33 元 / 王五 → 李四 25.00 元」,直接粘贴到微信群就能发。如果金额是随机分配的,还会附上每个人的具体金额。不需要截图,也不用手打。
纯浏览器端计算,数据不上传任何服务器。所有金额、人数、垫付信息都在本地 JavaScript 里处理,关闭页面后数据自动消失。不需要注册登录,也没有网络请求。如果担心隐私,可以断网使用,计算结果不受影响。
金额输入框只接受数字和小数点,不限制货币单位。你可以在总金额里直接输入「15000」(日元),结果会显示每人应付 5000(日元)。货币符号需要自己在复制结果时手动加上,工具本身不做汇率换算。适合任何货币的平摊场景,只要大家约定好统一用同一种货币计价。
没有硬性人数上限,但超过 100 人时浏览器渲染结果列表可能略有延迟。实测在普通手机上 200 人以内点击计算后 1 秒内出结果。如果人数超过 500,建议分批次算,或者用电脑端浏览器操作。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。