我想最多四舍五入两位小数,但只有在必要时。

输入:

10
1.7777777
9.1

输出:

10
1.78
9.1

如何在JavaScript中执行此操作?


当前回答

这个答案更关乎速度。

var precalculatedPrecisions = [1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10];

function round(num, _prec) {
    _precision = precalculatedPrecisions[_prec]
    return Math.round(num * _precision + 1e-14) / _precision ;
}

jsPerf关于这一点。

其他回答

我为自己编写了以下一组函数。也许这对你也有帮助。

function float_exponent(number) {
    exponent = 1;
    while (number < 1.0) {
        exponent += 1
        number *= 10
    }
    return exponent;
}
function format_float(number, extra_precision) {
    precision = float_exponent(number) + (extra_precision || 0)
    return number.toFixed(precision).split(/\.?0+$/)[0]
}

用法:

format_float(1.01); // 1
format_float(1.06); // 1.1
format_float(0.126); // 0.13
format_float(0.000189); // 0.00019

对于您的情况:

format_float(10, 1); // 10
format_float(9.1, 1); // 9.1
format_float(1.77777, 1); // 1.78

这个函数对我有用。你只需输入数字和你想要舍入的位置,它就可以轻松地完成所需的操作。

round(source, n) {
  let places = Math.pow(10, n);

  return Math.round(source * places) / places;
}

最简单的方法是使用toFixed,然后使用Number函数去除尾随零:

const number = 15.5;
Number(number.toFixed(2)); // 15.5
const number = 1.7777777;
Number(number.toFixed(2)); // 1.78

为了记录在案,如果要舍入的数字和位数足够大,缩放方法理论上可以返回无穷大。在JavaScript中,这应该不是问题,因为最大数字是1.7976931348623157e+308,但如果您使用的是非常大的数字或很多小数位数,您可以尝试使用此函数:

Number.prototype.roundTo=函数(数字){var str=this.toString();var split=this.toString().split('e');var scientific=split.length>1;var指数;if(科学){str=拆分[0];var decimal=str.split('.');如果(小数长度<2)返回此;index=十进制[0]。长度+1+位;}其他的index=Math.floor(this).toString().length+1+位数;if(str.length<=索引)返回此;var数字=str[index+1];var num=Number.parseFloat(str.substring(0,索引));如果(数字>=5){var extra=数学.pow(10,-位);返回此<0?num-额外:num+额外;}if(科学)num+=“e”+拆分[1];返回num;}

从我在MDN上找到的precisionRound(1.005的事件返回1而不是1.01)上提出的示例开始,我编写了一个自定义precisionRound,用于管理随机精度数,1.005返回1.01。

这是一个函数:

function precisionRound(number, precision)
{
  if(precision < 0)
  {
    var factor = Math.pow(10, precision);
    return Math.round(number * factor) / factor;
  }
  else
    return +(Math.round(number + "e+"+precision)  + "e-"+precision);
}

console.log(precisionRound(1234.5678, 1));  // output: 1234.6
console.log(precisionRound(1234.5678, -1)); // output: 1230
console.log(precisionRound(1.005, 2));      // output: 1.01
console.log(precisionRound(1.0005, 2));     // output: 1
console.log(precisionRound(1.0005, 3));     // output: 1.001
console.log(precisionRound(1.0005, 4));     // output: 1.0005

对于TypeScript:

public static precisionRound(number: number, precision: number)
{
  if (precision < 0)
  {
    let factor = Math.pow(10, precision);
    return Math.round(number * factor) / factor;
  }
  else
    return +(Math.round(Number(number + "e+" + precision)) +
      "e-" + precision);
}