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

输入:

10
1.7777777
9.1

输出:

10
1.78
9.1

如何在JavaScript中执行此操作?


当前回答

我发现这适用于我的所有用例:

const round = (value, decimalPlaces = 0) => {
    const multiplier = Math.pow(10, decimalPlaces);
    return Math.round(value * multiplier + Number.EPSILON) / multiplier;
};

记住这是ES6。ES5的等效版本很容易编写,所以我不打算添加它。

其他回答

这是我解决这个问题的方法:

function roundNumber(number, precision = 0) {
    var num = number.toString().replace(",", "");
    var integer, decimal, significantDigit;

    if (num.indexOf(".") > 0 && num.substring(num.indexOf(".") + 1).length > precision && precision > 0) {
        integer = parseInt(num).toString();
        decimal = num.substring(num.indexOf(".") + 1);
        significantDigit = Number(decimal.substr(precision, 1));

        if (significantDigit >= 5) {
            decimal = (Number(decimal.substr(0, precision)) + 1).toString();
            return integer + "." + decimal;
        } else {
            decimal = (Number(decimal.substr(0, precision)) + 1).toString();
            return integer + "." + decimal;
        }
    }
    else if (num.indexOf(".") > 0) {
        integer = parseInt(num).toString();
        decimal = num.substring(num.indexOf(".") + 1);
        significantDigit = num.substring(num.length - 1, 1);

        if (significantDigit >= 5) {
            decimal = (Number(decimal) + 1).toString();
            return integer + "." + decimal;
        } else {
            return integer + "." + decimal;
        }
    }

    return number;
}
var roundUpto = function(number, upto){
    return Number(number.toFixed(upto));
}
roundUpto(0.1464676, 2);

toFixed(2):这里2是我们要舍入的位数。

从我在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);
}

在Node.js环境中,我只使用roundTo模块:

const roundTo = require('round-to');
...
roundTo(123.4567, 2);

// 123.46

具有可读选项的函数更直观:

function round_number(options) {
    const places = 10**options.decimal_places;
    const res = Math.round(options.number * places)/places;
    return(res)
}

用法:

round_number({
    number : 0.5555555555555556,
    decimal_places : 3
})

0.556