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

实现与iOS端Numi App一致的JavaScript小数计算逻辑

解决JavaScript浮点精度匹配Numi App计算结果的问题

问题背景

在iOS端Numi App中执行以下计算逻辑时结果正确,但用JavaScript实现相同逻辑并设置6位小数精度后,得到的total值为4.000001,无法与输入的amount(值为4)严格相等:

给定计算逻辑:

amount = 4;
commission = 0.5; 
round = 6;
result = amount / (1 + commission / 100);
fee = result * (commission / 100)
total = result + fee

原测试代码:

testFunction(4);

function testFunction(amount) {
  const commission = 0.5;
  const round = 6;

  const finalAmount = amount / (1 + commission / 100);
  const result = roundOff(finalAmount, round);
  const fee = roundOff(result * (commission/100), round);
  const total = roundOff(result + fee, round);
  if(amount > total || amount < total)
  console.log("Qty: " + result + " fee: " + fee + " Total = "+ total);
  return total;
}

function roundOff (x, n) {
 return Number(parseFloat(Math.round(x * Math.pow(10, n)) / Math.pow(10, n)).toFixed(n));
}

解决方案

问题核心是浮点运算的精度误差加上分步四舍五入的累积偏差。要让total严格等于输入的amount,调整逻辑如下:

  • 先计算并四舍五入得到result(最终数量)
  • 直接用amount - result得到fee,而非通过result重新计算佣金
  • total直接取输入的amount,无需额外计算

修改后的代码:

testFunction(4);

function testFunction(amount) {
  const commission = 0.5;
  const round = 6;

  // 计算基础结果并按指定小数位四舍五入
  const finalAmount = amount / (1 + commission / 100);
  const result = roundOff(finalAmount, round);
  // 通过总金额与结果的差值得到佣金,避免二次计算的精度偏差
  const fee = roundOff(amount - result, round);
  // total严格等于输入的amount
  const total = amount;

  console.log("Qty: " + result + " fee: " + fee + " Total = "+ total);
  return total;
}

function roundOff (x, n) {
 return Number(parseFloat(Math.round(x * Math.pow(10, n)) / Math.pow(10, n)).toFixed(n));
}

逻辑说明

从数学定义上,amount = result + fee,因此fee = amount - result是最直接的推导方式,能确保total始终等于输入的amount。同时对result和fee分别做小数位处理,既符合精度要求,又避免了分步计算佣金带来的浮点偏差,这与Numi App的计算逻辑一致——Numi会优先保证总金额与输入值严格相等,再推导佣金金额。

内容的提问来源于stack exchange,提问作者Praveen Kumar s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:05:35