我怎样才能在JavaScript中四舍五入? .toFixed()返回一个string?

我在这里错过了什么?

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

为什么 .toFixed()返回一个string?

我想将数字四舍五入到2个十进制数字。

它返回一个string,因为在二进制浮点系统中,0.1和它的权力(用来显示小数)不能表示(至less不是完全准确的)。

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

因此(没有十进制浮点数或有理数types),将其作为string输出是将其精确到显示所需精度的唯一方法。

我已经解决了这个问题:

 someNumber = someNumber.toFixed(2) 

有了这个:

 someNumber = (someNumber.toFixed(2))/1; 

也许可以帮助别人!

我不太喜欢jsperf,这里有两个方法比较的链接:
https://jsperf.com/rounding-a-number-2

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. 

或者,如果你想要一个类似本机的function,在这里你是:

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

为什么不使用parseFloat ?

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

当然,它返回一个string。 如果你想舍入数字variables,你可以使用Math.round()来代替。 toFixed的要点是用固定的小数位数来格式化数字, 以便显示给用户

我用JavaScript的Number()函数把它转换回数字来解决它

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

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

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