我在这里错过了什么吗?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
为什么.toFixed()
会返回一个字符串?
我想将数字四舍五入到2位小数。
它返回一个字符串,因为0.1及其功率(用于显示小数部分)在二进制浮点系统中是不可表示的(至少不具有完全准确性)。
例如,0.1实际上是0.1000000000000000055511151231257827021181583404541015625,0.01实际上是0.01000000000000000020816681711721685132943093776702880859375。 (感谢BigDecimal
证明我的观点。:-P)
因此(没有十进制浮点或有理数字类型),将其输出为字符串是将其修剪为精确显示所需精度的唯一方法。
这是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
举例说明为什么它必须是一个字符串:
如果格式化1.toFixed(2),则会得到'1.00'。
这与1不同,因为1没有2位小数。
我知道JavaScript并不是一种性能语言,但如果你使用类似的东西,你可能会获得更好的舍入性能:roundedValue = Math.round(value * 100)* 0.01
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.
.
或者如果你想要一个类似本机的函数,你可以扩展原型:
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";
但是,请记住,当您编写模块时,污染原型会被视为不良,因为模块不应该有任何副作用。
我通过更改此问题解决了这个问题:
someNumber = someNumber.toFixed(2)
......对此:
someNumber = +someNumber.toFixed(2);
但是,这会将数字转换为字符串并再次解析,这将对性能产生重大影响。如果您关心性能或类型安全性,请检查其他答案。
为什么不使用parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
当然它返回一个字符串。如果你想绕数字变量,你可以使用Math.round()。 toFixed的要点是格式化具有固定小数位数的数字以显示给用户。
我通过使用JavaScript Number()
函数将其转换回数字来解决它
var x = 2.2873424;
x = Number(x.toFixed(2));
当它应该格式化数字时,你会期望它返回什么?如果你有一个数字,你几乎不能做任何事情,因为eg2 == 2.0 == 2.00
等所以它必须是一个字符串。
您只需使用“+”将结果转换为数字即可。
var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
因为它的主要用途是显示数字?如果要对数字进行舍入,请使用Math.round()
和适当的因子。