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

时间:2012-08-24 08:33:45

标签: javascript

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

var number = 11.995;
number.toFixed(2); // giving me 11.99 which is correct

var number = 19.995;
number.toFixed(2); // giving me 20.00 which is incorrect

任何人都可以告诉我它为什么会发生。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

这就是浮点数学的工作原理。值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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我已经创建了一个为我完成所有功能的功能..

    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);