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

JavaScript中Math.round舍入异常:130.325与30.325结果不一致

JavaScript中130.325与30.325舍入结果差异的原因及解决办法

你遇到的问题是典型的浮点数精度陷阱,直接看代码示例就能清楚问题:

Math.round((130.325) * 100) / 100 // 输出130.32,而非预期的130.33
Math.round((30.325) * 100) / 100 // 输出30.33,符合预期

明明小数点后三位都是.325,结果却截然不同,核心原因在于十进制浮点数在二进制中的存储精度限制。

原因分析

计算机底层用二进制存储浮点数,而部分十进制小数无法被二进制精确表示,只能存储近似值:

  • 30.325的二进制近似值略大于真实的30.325,乘以100后得到3032.5000000000005左右,Math.round处理后得到3033,除以100就是30.33。
  • 130.325的二进制近似值略小于真实的130.325,乘以100后得到13032.499999999998左右,Math.round处理后得到13032,除以100就是130.32。

解决方案

你自己给出的方案已经能有效解决问题,核心是通过Number.EPSILON(JavaScript中最小的正浮点数)修正精度误差,再通过多一位舍入确保结果准确:

static round(value: number) {
  const rounded = Math.round((value + Number.EPSILON) * 1000);
  return Math.round(rounded / 10) / 100;
}

另外还有几种常见的思路:

  • 字符串处理:将数字转为字符串后,按小数点分割手动处理舍入逻辑,适合精度控制要求极高的场景。
  • toFixed方法:注意toFixed返回字符串,需转成数字,部分场景下能直接得到正确结果:
    +(130.325).toFixed(2) // 输出130.33
    
  • 高精度库:如果是处理货币等敏感场景,推荐使用BigInt或专门的高精度数学库(如decimal.js)彻底规避浮点数误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:10:59