我是不是遗漏了什么?

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

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

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


当前回答

当它格式化一个数字时,你期望它返回什么?如果你有一个数字,你几乎不能对它做任何事情,因为例如2 == 2.0 == 2.00等,所以它必须是一个字符串。

其他回答

小心使用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

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

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

为什么不使用parseFloat呢?

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

tofixed是一个用于在打印数字之前格式化数字的函数。它来自于toString, toExponential和torecision家族。

要四舍五入一个数字,你可以这样做:

someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;

// if you need 3 digits, replace 1e2 with 1e3 etc.
// or just copypaste this function to your code:

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

.

或者如果你想要一个“native-like”函数,你可以扩展原型:

Number.prototype.toFixedNumber = function(digits, base){
  var pow = Math.pow(base||10, digits);
  return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;


//or even hexadecimal

someNumber = 0xAF309/256;  //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";

然而,请记住,当你在编写模块时,污染原型是不好的,因为模块不应该有任何副作用。因此,对于一个模块,使用第一个函数。

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

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

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