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

输入:

10
1.7777777
9.1

输出:

10
1.78
9.1

如何在JavaScript中执行此操作?


当前回答

考虑.toFixed()和.toPrecision():

http://www.javascriptkit.com/javatutors/formatnumber.shtml

其他回答

舍入问题可以通过使用指数表示法来避免。

public roundFinancial(amount: number, decimals: number) {
    return Number(Math.round(Number(`${amount}e${decimals}`)) + `e-${decimals}`);
}

parseFloat(“1.555”).toFixed(2);//返回1.55而不是1.56。

1.55是绝对正确的结果,因为在计算机中不存在1.555的精确表示。如果读数为1.555,则四舍五入至最接近的值=1.55499999999999994(64位浮点)。将这个数字四舍五入到Fixed(2)得到1.55。

如果输入为1.55499999999999,则此处提供的所有其他功能都会给出故障结果。

解决方案:在扫描前加上数字“5”,将数字舍入(更准确地说,从0开始舍入)。仅当数字真的是浮点(有小数点)时才执行此操作。

parseFloat("1.555"+"5").toFixed(2); // Returns 1.56

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

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;
}

根据评论中已给出的答案,链接至http://jsfiddle.net/AsRqx/,下面的一个对我来说很好。

function C(num)
{
    return +(Math.round(num + "e+2") + "e-2");
}

function N(num, places)
{
    return +(Math.round(num + "e+" + places) + "e-" + places);
}

C(1.005);

N(1.005, 0);
N(1.005, 1); // Up to 1 decimal places
N(1.005, 2); // Up to 2 decimal places
N(1.005, 3); // Up to 3 decimal places

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

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

// 123.46