当数字变大时,JavaScript 会将大的 INT转换为科学记数法。我怎样才能防止这种情况发生?
如何避免在 JavaScript 中使用大数的科学记数法?
有Number.toFixed,但如果数字 >= 1e21 并且最大精度为 20,则它使用科学记数法。除此之外,您可以自己滚动,但会很混乱。
function toFixed(x) {
if (Math.abs(x) < 1.0) {
var e = parseInt(x.toString().split('e-')[1]);
if (e) {
x *= Math.pow(10,e-1);
x = '0.' + (new Array(e)).join('0') + x.toString().substring(2);
}
} else {
var e = parseInt(x.toString().split('+')[1]);
if (e > 20) {
e -= 20;
x /= Math.pow(10,e);
x += (new Array(e+1)).join('0');
}
}
return x;
}
上面使用了便宜的'n'-easy 字符串重复 ( (new Array(n+1)).join(str)
)。您可以String.prototype.repeat
使用俄罗斯农民乘法定义并使用它。
此答案应仅适用于问题的上下文:在不使用科学记数法的情况下显示大量数字。对于其他任何事情,您都应该使用BigInt库,例如BigNumber、Leemon 的BigInt或BigInteger。展望未来,新的原生BigInt(注意:不是 Leemon 的)应该可用;Chromium和基于它的浏览器(Chrome、新的Edge [v79+]、Brave)和Firefox都有支持;Safari 的支持正在进行中。
以下是使用 BigInt 的方法: BigInt(n).toString()
例子:
但是请注意,您作为 JavaScript 数字(不是 BigInt)输出的任何超过 15-16 位(特别是大于Number.MAX_SAFE_INTEGER + 1
[9,007,199,254,740,992])的整数都可能会被四舍五入,因为 JavaScript 的数字类型(IEEE-754 双精度浮点数)不能精确地保存超出该点的所有整数。由于Number.MAX_SAFE_INTEGER + 1
它以 2 的倍数工作,所以它不能再容纳奇数(同样,在 18,014,398,509,481,984 开始以 4 的倍数工作,然后是 8,然后是 16,......)。
因此,如果您可以依靠BigInt
支持,请将您的号码输出为您传递给BigInt
函数的字符串:
const n = BigInt("YourNumberHere");
例子:
我知道这是一个较旧的问题,但最近显示活跃。MDN 到LocaleString
const myNumb = 1000000000000000000000;
console.log( myNumb ); // 1e+21
console.log( myNumb.toLocaleString() ); // "1,000,000,000,000,000,000,000"
console.log( myNumb.toLocaleString('fullwide', {useGrouping:false}) ); // "1000000000000000000000"
您可以使用选项来格式化输出。
笔记:
Number.toLocaleString() 在小数点后 16 位四舍五入,以便...
const myNumb = 586084736227728377283728272309128120398;
console.log( myNumb.toLocaleString('fullwide', { useGrouping: false }) );
...返回...
586084736227728400000000000000000000000
如果准确性在预期结果中很重要,这可能是不可取的。
对于小数,并且您知道需要多少位小数,您可以使用 toFixed 然后使用正则表达式删除尾随零。
Number(1e-7).toFixed(8).replace(/\.?0+$/,"") //0.000
另一种可能的解决方案:
function toFix(i){
var str='';
do{
let a = i%10;
i=Math.trunc(i/10);
str = a+str;
}while(i>0)
return str;
}
这是我Number.prototype.toFixed
适用于任何数字的方法的简短变体:
Number.prototype.toFixedSpecial = function(n) {
var str = this.toFixed(n);
if (str.indexOf('e+') === -1)
return str;
// if number is in scientific notation, pick (b)ase and (p)ower
str = str.replace('.', '').split('e+').reduce(function(b, p) {
return b + Array(p - b.length + 2).join(0);
});
if (n > 0)
str += '.' + Array(n + 1).join(0);
return str;
};
console.log( 1e21.toFixedSpecial(2) ); // "1000000000000000000000.00"
console.log( 2.1e24.toFixedSpecial(0) ); // "2100000000000000000000000"
console.log( 1234567..toFixedSpecial(1) ); // "1234567.0"
console.log( 1234567.89.toFixedSpecial(3) ); // "1234567.890"