我在这里错过了什么吗?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
为什么不.toFixed()
返回一个字符串?
我想将数字四舍五入为 2 个十进制数字。
我在这里错过了什么吗?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
为什么不.toFixed()
返回一个字符串?
我想将数字四舍五入为 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.
// or just copypaste this function to your code:
function toFixedNumber(num, digits, base){
var pow = Math.pow(base||10, digits);
return Math.round(num*pow) / pow;
}
.
或者,如果你想要一个“类似原生”的函数,你可以扩展原型:
Number.prototype.toFixedNumber = function(digits, base){
var pow = Math.pow(base||10, digits);
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";
但是,请记住,在编写module时污染原型被认为是不好的,因为module不应该有任何副作用。因此,对于module,请使用第一个函数。
它返回一个字符串,因为 0.1 及其幂(用于显示小数)在二进制浮点系统中无法表示(至少不是完全准确)。
例如,0.1 真的是 0.1000000000000000055511151231257827021181583404541015625,0.01 真的是 0.0100000000000000600000000673781820737307820181815827021181583404541015625 (感谢您BigDecimal
证明了我的观点。:-P)
因此(没有十进制浮点数或有理数类型),将其作为字符串输出是将其精确修剪为显示所需精度的唯一方法。
我通过改变这个解决了这个问题:
someNumber = someNumber.toFixed(2)
...到这个:
someNumber = +someNumber.toFixed(2);
但是,这会将数字转换为字符串并再次解析它,这将对性能产生重大影响。如果您关心性能或类型安全,请查看其他答案。
为什么不使用parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
我通过使用 JavaScript 的Number()
函数将其转换回数字来解决它
var x = 2.2873424;
x = Number(x.toFixed(2));