我怎样才能在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。 (感谢BigDecimal
certificate我的观点。:-P)
因此(没有十进制浮点数或有理数types),将其作为string输出是将其精确到显示所需精度的唯一方法。
我已经解决了这个问题:
someNumber = someNumber.toFixed(2)
有了这个:
someNumber = (someNumber.toFixed(2))/1;
也许可以帮助别人!
我不太喜欢jsperf,这里有两个方法比较的链接:
https://jsperf.com/rounding-a-number-2
。
Number.prototype.toFixed
是一个函数,用于在打印之前对数字进行格式化 。 它来自toString
, toExponential
和toPrecision
。
要一个数字,你可以这样做:
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()
和适当的因子。