toFixed javascript函数给出奇怪的结果

toFixed javascript function giving strange results?

本文关键字:结果 javascript 函数 toFixed      更新时间:2023-09-26

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

var数=11.995;number.toFixed(2);// 给我11.99,哪个是正确的var数=19.995;number.toFixed(2);// 给我20.00,这是不正确的

有人能告诉我为什么会发生这种事吗。

谢谢你的帮助。

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

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

我创建了一个函数,它为我完成了所有任务。

    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);
我猜大卫已经回答了你的疑问。只是在这里提供了一个替代解决方案。

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

类似这样的Math.floor(number*100)/100

有人能告诉我为什么会发生这种事吗。

JavaScript的number类型所使用的IEEE-754双精度二进制浮点数标准(以及其他几种语言中的类似时间)并不能完美地存储所有数字,它不精确地存储了一些数字。

对于11.995,实际值为11.99499988555908203125,只是比11.995稍微

对于19.995,实际值为19.9950008392333984375,仅略高于19.995

这就解释了为什么当您使用通常的四舍五入到最接近的半上运算对它们进行四舍五五入时,11.995(实际上是11.99499988555908203125)会向下舍入到11.99,而19.995(实际上是19.9950008392333984375)会向上舍入到20.00

(这个网站有一个方便的计算器来可视化这些东西。)

更多关于SO:

  • 浮点数学坏了吗
  • 如何处理JavaScript中的浮点数字精度