我在这里错过了什么吗?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
为什么 .toFixed()
会返回一个字符串?
我想将数字四舍五入为2位小数。
答案 0 :(得分:128)
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";
但是,请记住,当您编写模块时,污染原型会被视为不良,因为模块不应该有任何副作用。
答案 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;
}
答案 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))