You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS多人费用拆分算法问题:1欧元分3人需得到[0.33,0.33,0.34]

解决费用拆分的JS函数实现

核心要解决两个问题:浮点运算精度误差和剩余金额的分配,直接用小数计算容易出现精度问题,建议先将金额转换为整数(分)处理,再转回欧元,彻底规避精度陷阱。

实现思路

  1. 把总金额从欧元转成分(乘以100),用整数运算避免浮点误差
  2. 计算每人基础分配的分数:Math.floor(totalCents / numPeople)
  3. 算出剩余未分配的分数:totalCents % numPeople
  4. 前numPeople - remainder人分基础金额,剩下的remainder人多分1分
  5. 最后将每个元素转回欧元(除以100)

代码示例

function splitExpense(totalEur, numPeople) {
  // 转成整数分,规避浮点精度问题
  const totalCents = Math.round(totalEur * 100);
  const baseCents = Math.floor(totalCents / numPeople);
  const remainder = totalCents % numPeople;
  
  const result = [];
  // 前(numPeople - remainder)人拿基础金额
  for (let i = 0; i < numPeople - remainder; i++) {
    result.push(baseCents / 100);
  }
  // 剩余的人多拿1分
  for (let i = 0; i < remainder; i++) {
    result.push((baseCents + 1) / 100);
  }
  
  return result;
}

// 测试:1€拆分给3人
console.log(splitExpense(1, 3)); // 输出 [0.33, 0.33, 0.34]

为什么直接用小数差值会失败?

如果直接用1 / 3 = 0.333333...保留两位小数得到0.33,总和是0.99,差值0.01。但直接给最后一人加0.01,可能因浮点精度出现0.34000000000000003这类异常值,转整数处理就能彻底避免这种问题。

简化写法

用数组填充+映射的方式实现,代码更简洁:

function splitExpense(totalEur, numPeople) {
  const totalCents = Math.round(totalEur * 100);
  const baseCents = Math.floor(totalCents / numPeople);
  const remainder = totalCents % numPeople;
  
  return Array(numPeople)
    .fill(baseCents / 100)
    .map((amount, index) => 
      index >= numPeople - remainder ? amount + 0.01 : amount
    );
}

内容的提问来源于stack exchange,提问作者soap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:07:04