如何在JavaScript中舍入数字? .toFixed()返回一个字符串?

时间:2010-02-17 19:02:49

标签: javascript types rounding

我在这里错过了什么吗?

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

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

我想将数字四舍五入为2位小数。

15 个答案:

答案 0 :(得分:128)

Number.prototype.toFixed是一种在打印之前设计为格式数字的功能。它来自toStringtoExponentialtoPrecision的家人。

要对数字进行舍入,您可以这样做:

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

// if you need 3 digits, replace 1e2 with 1e3 etc.

或者如果你想要一个类似本机的函数,你可以扩展原型:

Number.prototype.toFixedNumber = function(x, base){
  var pow = Math.pow(base||10,x);
  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";

但是,请记住,当您编写模块时,污染原型会被视为不良,因为模块不应该有任何副作用。

答案 1 :(得分:107)

它返回一个字符串,因为0.1和它的功率(用于显示小数部分)在二进制浮点系统中是不可表示的(至少没有完全准确)。

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

因此(没有十进制浮点数或有理数字类型),将其输出为字符串是将其修剪为精确显示所需精度的唯一方法。

答案 2 :(得分:105)

我通过更改此问题解决了这个问题:

someNumber = someNumber.toFixed(2)

......对此:

someNumber = +someNumber.toFixed(2);

但是,这会将数字转换为字符串并再次解析,这将对性能产生重大影响。如果您关心性能或类型安全性,请检查其他答案。

答案 3 :(得分:22)

为什么不使用parseFloat

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

答案 4 :(得分:12)

当然它会返回一个字符串。如果你想绕数字变量,你可以使用Math.round()。 toFixed的要点是使用固定的小数位数格式化数字以显示给用户

答案 5 :(得分:11)

我使用JavaScript的Number()函数

将其转换回数字,从而解决了这个问题
var x = 2.2873424;
x = Number(x.toFixed(2));

答案 6 :(得分:3)

如果要格式化数字,您希望它返回什么?如果你有一个数字,你就不能用它做任何事情,例如2 == 2.0 == 2.00等等所以它必须是一个字符串。

答案 7 :(得分:3)

您只需使用' +'将结果转换为数字。

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03

答案 8 :(得分:2)

为什么不 * 结果乘以 1,即

someNumber.toFixed(2) * 1

答案 9 :(得分:1)

因为它的主要用途是显示数字?如果您想要对数字进行舍入,请使用Math.round()和适当的因素。

答案 10 :(得分:1)

以下是提供的答案m93a的稍微实用的版本。

const toFixedNumber = (toFixTo = 2, base = 10) => num => {
  const pow = Math.pow(base, toFixTo)
  return +(Math.round(num * pow) / pow)
}

const oneNumber = 10.12323223

const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123

// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12

答案 11 :(得分:1)

对于像我这样发生在这个非常老的问题上的其他人,这是一个现代的解决方案:

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

ref:https://stackoverflow.com/a/11832950

答案 12 :(得分:1)

可能为时已晚,但是您可以将输出乘以1再次转换为数字,这是一个示例。

const x1 = 1211.1212121;
const x2 = x1.toFixed(2)*1;
console.log(typeof(x2));

答案 13 :(得分:0)

提供一个为什么它必须为字符串的示例:

如果将1.toFixed(2)格式设置为1.00,则为

这与1不同,因为1没有2位小数。


我知道JavaScript并非完全是 performance 语言,但是如果使用类似以下内容,则可能会为四舍五入带来更好的性能: roundedValue = Math.round(value * 100)* 0.01

答案 14 :(得分:0)

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

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