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