我是不是遗漏了什么?

var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string

为什么.toFixed()返回一个字符串?

我想把这个数四舍五入到两位十进制数字。


当前回答

我通过使用JavaScript的number()函数将其转换回数字来解决这个问题

var x = 2.2873424;
x = Number(x.toFixed(2));

其他回答

小心使用toFixed()和Math.round(),由于浮点数系统,它们可能会产生意想不到的结果:

function toFixedNumber(num, digits, base){
  var pow = Math.pow(base||10, digits);
  return Math.round(num*pow) / pow;
}

console.log(toFixedNumber(130.795, 2, 10));
// 130.79 (incorrect)
console.log(toFixedNumber(100.795, 2, 10));
// 100.8 

console.log(+130.795.toFixed(2));
// 130.79 (incorrect)
console.log(+100.795.toFixed(2));
// 100.8

我建议使用Lodash的_.round()函数:https://lodash.com/docs/4.17.15#round

_.round(130.795, 2);
// 130.8

它返回一个字符串,因为0.1及其幂(用于显示十进制分数)在二进制浮点系统中不可表示(至少不能完全准确地表示)。

例如,0.1实际上是0.1000000000000000055511151231257827021181583404541015625,0.01实际上是0.01000000000000000020816681711721685132943093776702880859375。(感谢BigDecimal证明了我的观点。: - p)

因此(在没有小数浮点数或有理数类型的情况下),将其作为字符串输出是使其精确到显示所需精度的唯一方法。

对于像我这样偶然遇到这个古老问题的人,一个现代的解决方案:

const roundValue = (num, decimals = 2) => {
    let scaling = 10 ** decimals;
    return Math.round((num + Number.EPSILON) * scaling) / scaling;
}

裁判:https://stackoverflow.com/a/11832950

当然它会返回一个字符串。如果要对数值变量进行四舍五入,则应该使用Math.round()。toFixed的目的是用固定的小数位数格式化数字,以便显示给用户。

你应该像下面这样使用它。

var someNumber: number = 0.000000;
someNumber = Number(someNumber.toFixed(2))