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

JS乘法出现浮点数精度误差原因,如何计算保留两位小数的数值

问题原因说明

你遇到的长小数问题是IEEE 754浮点数存储标准的固有特性导致的:
JavaScript 中所有数字都是以64位双精度浮点数的形式存储,二进制的存储规则无法精确表示所有十进制小数,例如你代码里的3.3转换为二进制是无限循环的小数,存储时会被截断为近似值,本身就和十进制的精确3.3存在微小误差,乘以3后误差被放大,最终就出现了9.899999999999999的计算结果。

解决方案

基础方案(普通场景可用)

直接使用toFixed(2)方法将结果格式化为两位小数即可,注意该方法返回的是字符串类型,如果后续需要对结果做数值计算,需要手动转为数字类型:

$('.amount').on('keyup', function (e) {
    e.preventDefault();
    
    var amount = Number($('.amount').val()); 
    var price = Number($('.price').val());
    var total = amount * price;
  
    $('.total').val(total.toFixed(2));
});

高精度方案(金额等敏感场景推荐)

如果是金额类对精度要求极高的场景,推荐先将小数放大为整数运算,避免浮点数运算的误差累积,再转换回小数展示:

$('.amount').on('keyup', function (e) {
    e.preventDefault();
    
    var amount = Number($('.amount').val()); 
    // 价格转成分(整数)计算
    var priceCent = Math.round(Number($('.price').val()) * 100);
    var totalCent = amount * priceCent;
    // 计算完成后转回元,保留两位小数
    var total = (totalCent / 100).toFixed(2);
  
    $('.total').val(total);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:09:03