Javascript:将舍入数字格式化为N个小数

hoj*_*oju 100 javascript math decimal-point rounding

在JavaScript中,将数字舍入到N个小数位的典型方法是:

function roundNumber(num, dec) {
  return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}
Run Code Online (Sandbox Code Playgroud)

然而,这种方法将舍入到最多 N个小数位,而我想要总是舍入到N个小数位.例如,"2.0"将四舍五入为"2".

有任何想法吗?

Dav*_*vid 230

我认为这里给出了一个更简单的方法,并且Number.toFixed()已经在JavaScript中实现了该方法.

简单地写:

var myNumber = 2;

myNumber.toFixed(2); //returns "2.00"
myNumber.toFixed(1); //returns "2.0"
Run Code Online (Sandbox Code Playgroud)

等等...

  • 警告:`toFixed()`返回一个字符串. (9认同)
  • @JordanArseno,可以使用parseInt(myNumber.toFixed(intVar))进行修复。返回整数值,或parseFloat(myNumber.toFixed(floatVar)); 如果用户有小数位,则返回浮点数。 (2认同)

Eli*_*ria 50

我找到了一个方法.这是Christoph的代码修复:

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

阅读重复使用数组构造一个字符的细节在这里,如果你是好奇,为什么我添加了"+ 1".

  • 此方法存在错误:toFixed(-0.1111,2)返回0.11,即负号丢失. (2认同)
  • @Matt,谢谢你的指出.我修复了这个bug. (2认同)

Guf*_*ffa 23

这不是一个四舍五入的问题,这是一个显示问题.数字不包含有效数字的信息; 值2与2.0000000000000相同.当您将舍入值转换为字符串时,它会使其显示一定数量的数字.

您可以在数字后添加零,例如:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';
Run Code Online (Sandbox Code Playgroud)

(请注意,这假设客户端的区域设置使用句点作为小数分隔符,代码需要更多工作才能用于其他设置.)

  • @deepeshk在什么浏览器中?刚试过Chrome 17和`1.02449999998.toFixed(4)`正确返回`1.0245`. (10认同)
  • toFixed是buggy ..例如小数:1.02449999998如果你做dec.toFixed(4)=> 1.0244.应该是1.0245而不是. (3认同)
  • @MarkTomlin:然后看来你有一个字符串而不是一个数字. (3认同)
  • @deepeshk但是在舍入后使用`toFixed()`来填充结尾的小数是什么问题? (2认同)

de.*_*.ru 15

总有一种更好的做事方式.

var number = 51.93999999999761;
Run Code Online (Sandbox Code Playgroud)

我想得到四位数的精度:51.94

做就是了:

number.toPrecision(4);
Run Code Online (Sandbox Code Playgroud)

结果将是:51.94

  • 如果加 100 呢?你需要把它改成 number.toPrecision(5) 吗? (4认同)
  • 是.31.939383.toPrecision(4)>"31.94"/ 131.939383.toPrecision(4)>"131.9" (2认同)
  • 请注意,这不会四舍五入到 n 位小数,而是四舍五入到 n *sigfigs* 并且返回一个字符串。例如,“(1234.56789).toPrecision(4)”返回“1235”而不是“1234.5679” (2认同)

Geo*_*lis 7

这适用于四舍五入到 N 位(如果您只想截断到 N 位,请删除 Math.round 调用并使用 Math.trunc ):

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}
Run Code Online (Sandbox Code Playgroud)

过去,当我编写数据操作 E-Slate 组件时,不得不在 Java 中求助于这样的逻辑。那是因为我发现将 0.1 多次加到 0 上,最终会得到一些意想不到的长小数部分(这是由于浮点运算造成的)。

格式数字中始终显示小数点后 2 位的用户评论将这种技术称为缩放。

有人提到有些情况没有按预期进行舍入,在http://www.jacklmoore.com/notes/rounding-in-javascript/上建议这样做:

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
Run Code Online (Sandbox Code Playgroud)


mel*_*rum 7

function roundton(num, n) {
    return Number(num.toFixed(n));
}
Run Code Online (Sandbox Code Playgroud)

这使用了 JS 的内置方法,Number.prototype.toFixed该方法用于格式化字符串,但允许我们四舍五入到特定的位数。调用Number()将其干净地转换回数字对象

理想情况下,我们不需要将其转换为字符串,但toFixed它是用本机 C++ 编写的,执行基本的 cstring 操作,因此它可能仍然很快。

  • 这是迄今为止最好的答案。 (2认同)

Joh*_*zle 5

PHP-Like舍入方法

下面的代码可用于将您自己的Math.round版本添加到您自己的命名空间,该命名空间采用精度参数.与上面示例中的十进制舍入不同,它不执行与字符串的转换,并且precision参数与PHP和Excel的工作方式相同,其中正1将舍入到1个小数位,-1将舍入到数十.

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230
Run Code Online (Sandbox Code Playgroud)

来自Mozilla开发人员参考Math.round()