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

问题描述 投票:134回答:11

我在这里错过了什么吗?

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

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

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

javascript types rounding
11个回答
107
投票

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

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

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


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

0
投票

举例说明为什么它必须是一个字符串:

如果格式化1.toFixed(2),则会得到'1.00'。

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


我知道JavaScript并不是一种性能语言,但如果你使用类似的东西,你可能会获得更好的舍入性能:roundedValue = Math.round(value * 100)* 0.01


130
投票

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

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


105
投票

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

someNumber = someNumber.toFixed(2)

......对此:

someNumber = +someNumber.toFixed(2);

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


23
投票

为什么不使用parseFloat

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

12
投票

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


11
投票

我通过使用JavaScript Number()函数将其转换回数字来解决它

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

3
投票

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


3
投票

您只需使用“+”将结果转换为数字即可。

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

1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.