Javascript toFixed功能

时间:2009-09-08 10:57:41

标签: javascript function

我对toFixed()函数有疑问。如果我有一个浮动,例如 - 3.123123423 0 。如何将其输出到带有toFixed(2)的输入框,以便输入框值为 3.12 0 。我的意思是如果值是整数我想要输出它而不尾随 .00 :)

7 个答案:

答案 0 :(得分:11)

由于JavaScript中的整数和浮点数没有区别,这是我的quick'n'dirty方法:

theNumber.toFixed(2).replace(".00", "");

或者通用的东西:

myToFixed = function (n, digits) {
    digits = digits || 0;
    return n.toFixed(digits).replace(new RegExp("\\.0{" + digits + "}"), "");
}

myToFixed(32.1212, 2) --> "32.12"
myToFixed(32.1212, 0) --> "32"
myToFixed(32, 2) --> "32"
myToFixed(32.1, 2) --> "32.10"

答案 1 :(得分:4)

您不需要Math.round():

var toFixed = function(val, n) {
  var result = val.toFixed(n);
  if (result == val)
    return val.toString();
  return result;
}

toFixed(3.123, 2) --> "3.12"
toFixed(3, 2) --> "3"

答案 2 :(得分:2)

function toFixed0d(x, d)
{
    if(Math.round(x) == x)
    {
        return x.toString();
    }else
    {
        return x.toFixed(d);
    }
}

toFixed0d(3.123123423, 2) = "3.12"
toFixed0d(0, 2) = "0"

答案 3 :(得分:1)

请注意,toFixed()为broken in IE,通常不会依赖。在那里给出令人讨厌但精确舍入的替换功能。

答案 4 :(得分:1)

如果是其他浏览器,结果可能会有所不同。请注意此链接How to write a prototype for Number.toFixed in JavaScript?

答案 5 :(得分:1)

Number.toFixed会产生一些数学奇怪的结果,并为您提供您要求的小数位数,无论您是否需要它们。

Math.round在数学上是正确的,但不允许您指定精度。

这是一个在数学上正确的函数(忽略浮点错误),它可以为您提供所需的函数。

var roundToPlusInfinity = function(n, fd) {
    var scale = Math.pow(10, fd),
        rounded = fd ? Math.floor((n * scale + 0.5)) / scale :
        Math.round(n);
    return rounded.toString();
};

该算法是:向上扩展,使得您想要的数字位于小数点的左侧,添加.5(因此,在第一个无效的地方,&gt; = .5会导致整数部分的增量),< em> truncate (不是圆形!)并缩小。浮点错误有可能蔓延,但它比猥琐的toFixed函数更好。

测试出来:

roundToPlusInfinity(5.53335, 4);  // "5.3334"
roundToPlusInfinity(-9999.95, 1); // "-9999.9"
roundToPlusInfinity(3.00015, 3);  // "3"

由于存在浮点错误的可能性,缩小可能会产生类似“3.00000000001”的结果,这很烦人。这样的事情应该照顾它。

var trimFraction = function(s, fd) {
    var splitPoint = s.indexOf('.');
    if (splitPoint === -1) {
        return s;
    }

    var f = s.substring(splitPoint + 1, s.length),
        i = s.substring(0, splitPoint);
    if (f.length > fd) {
        f = f.substring(0, fd).replace(/0+$/, "");
    }
    if (f) {
        return i + '.' + f;
    }
    return i;
};

trimFraction("3.1000000001", 2); // "3.1"

您尚未明确所需的舍入算法。向无限远方向转向是你在学校学到的四舍五入的方法,你在那里围绕&gt; = .5 向上(即朝向正无穷大)。我相信在会计方面,正确的舍入算法(至少在瑞士和阿根廷之外)远离零。简单:

var roundAwayFromZero = function(n, fd) {
    var ret = roundToPlusInfinity(Math.abs(n), fd);
    return (n < 0) ? '-' + ret : ret;
};

roundAwayFromZero(-9999.95, 1);   // "-10000"

如果结果是用于人类呈现,则Intl.NumberFormat是可能的,因为您可以指定小数位的最小和最大数量。在撰写本文时,它并未得到广泛支持,并且假设Chrome正确实现了规范,则使用与toFixed相同的不可穿透且明显错误的截断算法。有趣的是,“货币”风格使用roundAwayFromZero(如果货币代码为“CHF”,则为圆形的一半,这是一个不错的选择)。

答案 6 :(得分:0)

这是我在想到这个问题一段时间之后想出的一个功能:

function toFixed (number, n) {
   return parseFloat(number.toFixed(n));
}

根据这个问题,这个函数将返回如下:

toFixed(3.123123423, 2);
> 3.12
toFixed(0, 2);
> 0
toFixed(3.1, 2);
> 3.1
toFixed(3.005, 2);
> 3
toFixed(3.005, 3);
> 3.005
toFixed(3.0500, 4);
> 3.05

请注意,JavaScript的toFixed对象的Number方法实际上返回String。上述toFixed函数将返回Number。如果您想要String,请改用以下内容:

function toFixed (number, n) {
   return parseFloat(number.toFixed(n)).toString();
}