旅行费用结算计算器
为每笔支出定好谁分摊多少,再加上已经转过的钱,生成每人余额和剩下的转账方案。
本计算器只计算你填入的数值。它不查询汇率,只按你自己填的汇率换算;它不执行银行转账;也不保存你填的姓名和金额,不会把它们留在地址栏里。
计算前要备好的数值
- 一起结算的人员名单。可填 2 到 20 人,姓名不能重复。
- 各笔支出,以及实际付款的人。
- 每笔支出按什么标准分摊。平摊就都填 1;住宿费按住宿晚数分摊,就填各自的晚数。
- 已按结算货币确定的账单金额。信用卡账单上有明确金额的,就填那个金额,不要再按现在的汇率换算一次。
- 旅行中已经互相转过的钱,以及被取消或退款的支出明细。
- 如果有支出还没有确定的账单金额,就要有付款币种的金额和当时适用的汇率。汇率需要你自己查好填入,计算器不会去查。
还有费用尚未换算成结算货币
在所有费用都以同一种结算货币确定之前,不会生成转账方案。请把下面这些行的换算填完,再重新计算。
参与者
可填 2 到 20 人。不必是真名,也不要填电话号码或银行账号。
支出与退款
为每笔支出定好付款人和分摊权重。若要按日期拆分住宿费,就每晚各加一笔支出,只给那晚实际住的人填 1。
已经互相转过的钱
这是旅行中已经转出去的钱。它不是支出,而是抵减余额的结算,所以不要再当成支出填一遍。
如果还没有互相转过钱,留空即可。
结算结果
关键合计
每人余额
正数是该收的钱,负数是该给的钱。把所有人的余额相加,正好是 0。
各笔支出的分摊额
权重为 0 的人分摊额是 0。把每一行的分摊额加起来,正好等于该笔支出的总额。
结清所需的转账方案
这是一个确定性的抵销方案,同样的输入总会得到同样的表。但它并不保证在所有可能的方案里转账次数最少。
没有需要再互相转的金额,结算已经完成。
这个结果基于哪些前提
- 作为确定账单金额填入的数字,是使用者已按结算货币核对过的值。按汇率换算的金额,只用使用者自己填的汇率计算,可能与实际账单金额不同。
- 各笔支出的权重是使用者商量好的标准。本计算器不判断哪种分摊方式更公平。
- 已经互相转过的钱,是按填入的金额确实已经交付来计算的。
- 无法按最小货币单位整除的零头,会按下面计算方法中的规则归到特定参与者身上。
计算方法
按下面的顺序计算。所有金额都按结算货币最小单位的整数处理,因此中间不会产生小数误差。
- 每笔支出中,各人的理想分摊额等于总额乘以自己的权重再除以权重之和,每个值都向下取整到最小单位。
- 向下取整后剩下的最小单位,从被舍去小数部分最大的人开始,每次分 1 个。因此分摊额之和永远与总额完全相等。
- 如果连小数部分都相同、无法排序,就按参与者 ID 升序领取。本页面的 ID 按添加参与者的先后顺序生成,所以名单上靠前的人先拿到 1 个单位。在界面上调整显示顺序,不会改变零头归谁。
- 每人的余额,等于代付金额减去应分摊金额,加上已经转出的钱,再减去已经收到的钱。收到退款的人,其代付金额会相应减少,因此可能显示为负数。
- 所有人余额相加正好是 0。计算核心会直接检验这个条件,一旦不成立就不给出结果,而是报错停止。
- 退款按与原支出完全相同的权重做负数分摊。累计退款不能超过原支出的金额。
- 转账建议的做法是,依次让该收最多的人和该给最多的人相互抵销。金额相同时按参与者 ID 升序排列。
- 按汇率换算的支出,用原币种金额乘以汇率,再四舍五入到结算货币的最小单位,正好一半时进位。乘法和取整都用分数进行,因此不会产生小数误差。这一步换算只在最开头做一次,在分摊之前完成。
- 只要还有一笔支出没换算完,就既不生成每人余额,也不生成转账方案。因为货币混在一起的结算表是错的。
屏幕上看到的金额是加了位分隔符的显示用字符串。不要拿这些数字再加一遍来验算,请看表里一并给出的合计。
分摊住宿费的两种方法
住宿费的结果取决于大家怎么约定。本计算器不替你决定哪种更公平,两种方法都能准确保住总额。
- 按每晚实际入住的人分摊
- 每一晚各加一笔支出,只给那晚实际住下的人填 1。如果各晚房价不同,就填当晚的实际房价。如果房费要付,那晚却没有任何人住,计算会停下来。你得先定好由谁承担。
- 按人乘以晚数的比例分摊
- 把住宿费总额作为一笔支出填入,权重里填各自的住宿晚数。请注意,因为没人使用的空房而产生的费用,同样会按总晚数的比例摊到大家头上。
虚构示例
这是用于演示界面的虚构示例,并非真实住宿价格或某个预订平台的条件。
甲、乙、丙三人用 USD 结算,450 美元的住宿费由甲付了。甲和乙住了 2 晚,丙住了 1 晚。
- 按每晚实际入住的人分摊来填,第 1 晚的 225 美元由三人分,第 2 晚的 225 美元由甲和乙分。分摊额是 187.50 / 187.50 / 75.00 美元。
- 示例按钮就是按这种方法填的。结果是甲收 262.50 美元,乙给 187.50 美元、丙给 75.00 美元就结清了。
- 按人乘以晚数的比例来填,450 美元作为一笔,权重是 2 / 2 / 1,得到 180 / 180 / 90 美元。两种方法的合计都是 450 美元。
点示例后,你现在填的值会被换成示例值。可以用页面上方的撤销按钮还原。
常见问题
- 它和普通的 AA 制计算器有什么不同?
- 普通的 AA 制计算器是把一笔总额按人数平摊,或者直接写下每个人的金额。想加上小费、马上看到人均多少时,那种更快。本计算器可以填入多笔支出,为每笔支出分别设定分摊的人和权重,并计入退款与已经互相转过的钱,生成每人余额和剩下的转账方案。如果只是把一顿饭钱平摊,请用普通的 AA 制计算器。
- 转账方案是次数最少的吗?
- 不是。它是依次让该给最多的人和该收最多的人相互抵销,所以同样的输入总会得到同样的表,但理论上可能存在次数更少的组合。请把它当作结清的一种方式来看。
- 用外币花的钱怎么填?
- 先为每笔支出选择:是否已有按结算货币确定的账单金额。像信用卡账单那样已有确定金额的,就填那个金额,不会再按现在的汇率换算一次。还没有确定金额的,就选按汇率换算,填入付款币种的金额和汇率。只要有一笔支出用了汇率,结果上就会加上估算值标记。本计算器不查询汇率,所以汇率要你自己查好再填。
- 境外交易手续费填在哪里?
- 如果手续费已经含在账单金额里,就不要另外再填,否则会重复计算。只有与账单金额分开单独扣掉的手续费,才另加一行支出,并用权重定好由谁承担。本计算器不会在汇率之上再加手续费。
- 1 个最小货币单位总是多算在某一个人身上。
- 因为无法拆分到最小货币单位以下。先把各人的分摊额向下取整,剩下的零头再从被舍去小数部分最大的人开始,每次给 1 个。只有这样,分摊额之和才能与总额完全相等。若连小数部分都相同,就按参与者 ID 升序,也就是先添加的人先拿。
- 退款那一行的权重为什么改不了?
- 退款是把原支出退回去,所以分摊标准必须一致。改了权重就不是退回,而是一次新的分配,余额会被扭曲。因此退款行会直接沿用所选原支出的权重。性质不同的赔偿金或慰问金,不要当成退款,请作为单独的支出填入并另行商定。
- 我填的姓名和金额会留在什么地方吗?
- 不会。计算只在浏览器内完成,不会发送到服务器。分享链接里不带这些值,所以地址栏和浏览记录里也不会留下。代价是刷新后填写内容会消失,需要的话请用复制结果按钮。
本计算器不做的事
- 不查询汇率。换算只用使用者自己填的汇率,只要还有费用没换算完,就不会生成转账方案。
- 不会自动加上境外交易手续费或取现手续费。没有含在账单金额里的手续费,需要你自己另加一行支出填入。
- 不执行银行转账,也不绑定账户,甚至不会要你填账号。
- 填了日期也不会自动生成住宿的每一晚。每一晚的支出都要你自己添加。
- 不猜测谁参与了哪笔支出,也不会把门票默认当成大家一起去。
- 不推荐哪种分摊方式更公平。
- 不保存你填的内容。刷新或关闭窗口后就会消失。
相关计算器
如果只是当场分掉一笔金额,下面的计算器更简单。
- AA 制分账计算器
— 把一笔总额按人数平摊,或者直接写下每个人的金额,并立刻显示小费比例和人均金额。它不处理多笔支出、逐笔的分摊人,以及已经互相转过的钱。
- 小费计算器
— 计算餐费要加的小费。把含小费在内的最终金额,作为本计算器的一笔支出填入即可。
- 百分比计算器
— 在定权重之前,想先算清比例时用它。