javascript – 破解到固定的实现

javascript的“Number.toFixed”的认实现似乎有点破碎.
console.log((8.555).toFixed(2));    // returns 8.56
console.log((8.565).toFixed(2));    // returns 8.57
console.log((8.575).toFixed(2));    // returns 8.57
console.log((8.585).toFixed(2));    // returns 8.59

我需要一种比这更一致的舍入方法.

在8.500和8.660之间的范围内,以下数字不能正确舍入.

8.575
8.635
8.645
8.655

我已经尝试按如下方式修复原型实现,但它只有一半.任何人都可以建议任何可以使其更一致地工作的变化吗?

Number.prototype.toFixed = function(decimalPlaces) {
    var factor = Math.pow(10,decimalPlaces || 0);
    var v = (Math.round(this * factor) / factor).toString();
    if (v.indexOf('.') >= 0) {
        return v + factor.toString().substr(v.length - v.indexOf('.'));
    }
    return v + '.' + factor.toString().substr(1);
};

解决方法

这是因为浮点错误.

比较(8.575).toFixed(20)和(8.575).toFixed(3)并想象这个命题:8.575< real(“8.575”),其中real是一个虚构函数,可以创建具有无限精度的实数. 也就是说,原始数字不符合预期,并且已经引入了不准确性. 我能想到的一个快速的“工作原理”是:乘以1000(或适当的话),得到它的toFixed(0)(仍然有一个限制,但它是荒谬的),然后以十进制形式推回. 快乐的编码.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...