解决toFixed()无法精准保留小数的问题

本文针对JavaScript中toFixed()方法在保留小数时存在的精度问题,提供了一种更精确的替代方案,通过自定义函数实现固定小数位数的四舍五入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近发现了一个问题用toFiexd() 保留小数有时不是很精确,
例如下面保留两位小数不是很精确:

 var a = 12.035;
console.log(a.toFixed(2)) // 12.04
var b = 12.045;
console.log(b.toFixed(2)) // 12.04

b 保留两位小数应该是12.05的

下面是我总结的保留两位小数的方法 ,有什么问题请大家指正,谢谢!

保留两位小数

function number(data){
    var value = Math.round(parseFloat(data) * 100) / 100;
    var d = value.toString().split(".");
    if (d.length == 1) {
        value = value.toString() + ".00";
        return value;
    }
    if (d.length > 1) {
        if (d[1].length < 2) {
            console.log(d[1])
            value = value.toString() + "0";
        }
        return value;
    }
}
number(12.4455)

自定义保留几位小数

function number(data,val){
    var numbers = '';
    // 保留几位小数后面添加几个0
    for (var i = 0; i < n; i++) {
        numbers += '0';
    }
    var s = 1 + numbers;
    // 如果是整数需要添加后面的0
    var spot = "." + numbers;
    // Math.round四舍五入  
    //  parseFloat() 函数可解析一个字符串,并返回一个浮点数。
    var value = Math.round(parseFloat(data) * s) / s;
    // 从小数点后面进行分割
    var d = value.toString().split(".");
    if (d.length == 1) {
        value = value.toString() + spot;
        return value;
    }
    if (d.length > 1) {
        if (d[1].length < 2) {
            value = value.toString() + "0";
        }
        return value;
    }
}
number(12.15478,3) // 参数(小数,保留几位小数)
toFixed方法是用来将一个数字保留指定位数的小数的方法。它返回的是一个字符串形式的结果,并且如果够指定的位数,会使用0进行补齐。然而,toFixed方法并是以四舍五入的方式进行取舍的,而是使用银行家舍入法进行取舍的。银行家舍入法是一种四舍六入五取偶的方法。具体规则如下: - 当舍去位的数值小于5时,直接舍去。 - 当舍去位的数值大于等于6时,在舍去的同时向前进一位。 - 当舍去位的数值等于5时: - 如果5后为空且全为0,则在舍去的同时向前进一位。 - 如果5后为空或全为0: - 如果5前的数值为奇数,则在舍去的同时向前进一位。 - 如果5前的数值为偶数,则直接舍去。 然而,有人发现使用toFixed方法时,遇到取舍位置为5的情况时会出现问题。例如,89.115.toFixed(2)会得到89.11而是89.12。这是因为toFixed方法在遇到5时会出现问题。为了解决这个问题,有人重写了toFixed方法,使用了自定义的逻辑来进行四舍五入。具体的重写代码如下: ```javascript Number.prototype.toFixed = function(d) { var s = this + ""; if (!d) d = 0; if (s.indexOf(".") == -1) s += "."; s += new Array(d + 1).join("0"); if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (d + 1) + "})?)\\d*$").test(s)) { var s = "0" + RegExp.$2, pm = RegExp.$1, a = RegExp.$3.length, b = true; if (a == d + 2) { a = s.match(/\d/g); if (parseInt(a\[a.length - 1\]) > 4) { for (var i = a.length - 2; i >= 0; i--) { a\[i\] = parseInt(a\[i\]) + 1; if (a\[i\] == 10) { a\[i\] = 0; b = i != 1; } else break; } } s = a.join("").replace(new RegExp("(\\d+)(\\d{" + d + "})\\d$"), "$1.$2"); } if (b) s = s.substr(1); return (pm + s).replace(/\.$/, ""); } return this + ""; }; ``` 这段代码重写了toFixed方法,使用了自定义的逻辑来进行四舍五入。但需要注意的是,这段代码并非官方提供的方法,使用时需要谨慎。 #### 引用[.reference_title] - *1* [JavaScript toFixed()四舍五入问题](https://blog.csdn.net/qq_38877858/article/details/108111072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [toFixed方法无法精准四舍五入的问题](https://blog.csdn.net/weixin_42597658/article/details/116535343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值