我在这里想念什么吗?
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个小数位数。
Answers:
它之所以返回一个字符串,是因为在二进制浮点系统中,0.1及其幂(用于显示十进制小数)不能表示(至少不能完全准确)。
例如,0.1实际上是0.1000000000000000055511151231257827021181583404541015625,而0.01实际上是0.01000000000000000020816681711721685132943093776702880859375。(感谢您BigDecimal
证明我的观点。:-P)
因此(缺少十进制浮点数或有理数类型),将其输出为字符串是将其修整到精确显示所需精度的唯一方法。
toFixed
是一种格式化功能,其唯一目的是将数字转换为字符串,并使用指定的小数位数对其进行格式化。它返回一个字符串的原因是因为它应该返回一个字符串,并且如果它被命名toStringFixed
,OP不会对结果感到惊讶。这里唯一的问题是OP希望它能像一样工作Math.round
,而无需参考JS参考。
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;
}
。
或者,如果您想要一个“ 类似native ”的函数,可以扩展原型:
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";
但是,请记住,编写模块时认为污染原型是不好的,因为模块不会产生任何副作用。因此,对于模块,请使用第一个功能。
type Number
。问题是+(anyValue)
总是返回一个数字-例如。+("45")
返回45
,+(new Number(42))
返回42
。这有点像强键入该函数。如果您养成习惯,则可以避免很多错误:)
someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
不是42.01
,而是~42.0099999999999980
。原因:该号码42.01
不存在,并四舍五入到最接近的现有号码。顺便说一句,按证明号toPrecision(18)
打印所有相关数字。
我通过更改此方法解决了这个问题:
someNumber = someNumber.toFixed(2)
...对此:
someNumber = +someNumber.toFixed(2);
但是,这会将数字转换为字符串,然后再次对其进行解析,这将对性能产生重大影响。如果您关心性能或键入安全性,请同时检查其他答案。
someNumber = Math.round(someNumber * 1e2) / 1e2
!请参阅我的答案,以获得更一般的方法。
为什么不使用parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
如果要格式化数字,您希望它返回什么?如果您有一个数字,那么您几乎不能做任何事情,因为例如2 == 2.0 == 2.00
等,所以它必须是一个字符串。
这是所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