4

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

变数 = 11.995;
number.toFixed(2); //给我 11.99 这是正确的

变数 = 19.995;
number.toFixed(2); //给我 20.00 这是不正确的

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

谢谢你的帮助。

4

4 回答 4

6

这就是浮点数学的工作原理。值 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
于 2012-08-24T08:44:41.643 回答
1

toFixed对值进行四舍五入。由于 19.995 恰好在 19.99 和 20.00 之间,它必须选择其中之一。传统上,舍入更喜欢偶数结果(这可以防止偏差,因为舍入和舍入将是相等的)。

于 2012-08-24T10:42:31.450 回答
1

我创建了一个为我完成所有工作的函数..

    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);
于 2015-03-13T05:28:38.430 回答
0

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

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

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

于 2012-08-24T09:01:13.720 回答