toFixed javascript 函数给出奇怪的结果?

IT技术 javascript
2021-02-11 17:30:01

我正在尝试将数字修复为小数点后的 2 位数字,为此我正在使用toFixedjavascript 函数。以下是我得到的奇怪结果,请检查并帮助我。

无功编号 = 11.995;
number.toFixed(2); //给我 11.99 这是正确的

无功编号 = 19.995;
number.toFixed(2); //给我 20.00 这是不正确的

谁能告诉我为什么会这样。

谢谢你的帮助。

4个回答

这就是浮点数学的工作原理。值 19.995 不是精确的二进制(基数为 2)。为了更清楚,当你除以 10/3 时,请考虑一个确切的数字。

有关更深入的解释,请阅读:http : //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

在您的情况下,您可以使用字符串来代替(至少看起来这是您想要的):

number.toString().substr(0, n);

或者定义一个这样的函数(2分钟完成,只是一个例子):

Number.toFixed = function(no, n) {
    var spl = no.toString().split('.');
    if ( spl.length > 1 ) {
        return spl[0]+'.'+spl[1].substr(0,n);
    }
    return spl[0];
}

Number.toFixed(19.995, 2); // 19.99
在这种情况下,0,4 只给出 1 个小数。您最好使用indexOf来检测点,或者仅使用 RegExp 进行单行:/-?\d+(\.\d{0,2})?/注意:正则表达式不完整,它不处理指数。
2021-03-14 17:30:01
@RobW 正确,但它并不意味着只是理论上的精确替代品。不过谢谢!
2021-04-03 17:30:01

toFixed舍入该值。由于 19.995 正好介于 19.99 和 20.00 之间,因此它必须选择其中之一。传统上,舍入更喜欢偶数结果(这可以防止偏差,因为向上舍入和向下舍入将相等)。

不,它并不总是四舍五入,这就是最初的问题。F.ex(11.995).toFixed(2)是 11.99
2021-03-20 17:30:01
那是因为你之前说的,它不准确。正好是一半的那个。
2021-03-25 17:30:01
但是,一些浮点分数是精确的,例如 0.5。但是,看起来我对它的四舍五入是错误的,它总是四舍五入。0.5.toFixed(0)是 1,1.5.toFixed(0)是 2。
2021-03-30 17:30:01
它没有“选择”。19.995 不完全是一半,因为浮点数在 javascript 中并不准确。您可以通过添加19.999991 + 0.000004wich equals来测试这一点19.999995000000002
2021-04-13 17:30:01

我创建了一个功能,它为我完成了所有工作..

    function toFixed(number, precision) {
        var multiplier = Math.pow(10, precision + 1),
            wholeNumber = Math.floor(number * multiplier);
        return Math.round(wholeNumber / 10) * 10 / multiplier;
    }

   //Call this function to retrive exect value
    toFixed((+adjustmentval), 2);
我的想法完全正确!太糟糕了toFixed没有这样做 - 我们怎么知道可能有问题?好吧,我想我们应该知道(?)...
2021-03-17 17:30:01

我猜大卫已经回答了你的疑问。只是在这里提供一个替代解决方案。

您可以Math.floor()为此使用Math 对象方法。

像这样的东西, Math.floor(number*100)/100