当在字符串上下文中使用时,JavaScript将超过21位的整数转换为科学符号。我打印了一个整数作为URL的一部分。我怎样才能阻止这种转变的发生?


当前回答

这对我没有帮助:

console.log( myNumb.toLocaleString('fullwide', {useGrouping:false}) );

但这:

value.toLocaleString("fullwide", { 
   useGrouping: false, 
   maximumSignificantDigits: 20,
})

其他回答

有号码。固定,但如果数字>= 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、lemon 's BigInt或BigInteger。展望未来,新的原生BigInt(注意:不是lemon的)应该可用;Chromium和基于它的浏览器(Chrome、新的Edge [v79+]、Brave)和Firefox都支持;Safari的支持正在进行中。

BigInt(n).toString()

例子:

Const n = 13523563246234613317632; console.log("toFixed (wrong): " + n.toFixed()); console.log("BigInt(右):" + BigInt(n).toString());

Beware, though, that any integer you output as a JavaScript number (not a BigInt) that's more than 15-16 digits (specifically, greater than Number.MAX_SAFE_INTEGER + 1 [9,007,199,254,740,992]) may be be rounded, because JavaScript's number type (IEEE-754 double-precision floating point) can't precisely hold all integers beyond that point. As of Number.MAX_SAFE_INTEGER + 1 it's working in multiples of 2, so it can't hold odd numbers anymore (and similiarly, at 18,014,398,509,481,984 it starts working in multiples of 4, then 8, then 16, ...).

因此,如果你可以依赖BigInt支持,输出你的数字作为一个字符串传递给BigInt函数:

const n = BigInt("YourNumberHere");

例子:

const n1 = BigInt(18014398509481985);//错误,将四舍五入到18014398509481984 在' BigInt '看到它之前 console.log(n1.toString() + " <== error "); const n2 = BigInt("18014398509481985");//右,BigInt处理它 console.log(n2.toString() + " <== Right");

如果你想将科学计数法转换为整数:

parseInt(“5.6456564564545e+23”, 10)

结果:5

您可以循环该数字并实现舍入

//函数替换给定索引的char

String.prototype.replaceAt=function(index, character) {
    return this.substr(0, index) + character + this.substr(index+character.length);
}

//开始循环该数字

var str = "123456789123456799.55";
var arr = str.split('.');
str = arr[0];
i = (str.length-1);
if(arr[1].length && Math.round(arr[1]/100)){
  while(i>0){
    var intVal = parseInt(str.charAt(i));

   if(intVal == 9){
      str = str.replaceAt(i,'0');
      console.log(1,str)
   }else{
      str = str.replaceAt(i,(intVal+1).toString()); 
      console.log(2,i,(intVal+1).toString(),str)
      break;
   }
   i--;
 }
}

这对我没有帮助:

console.log( myNumb.toLocaleString('fullwide', {useGrouping:false}) );

但这:

value.toLocaleString("fullwide", { 
   useGrouping: false, 
   maximumSignificantDigits: 20,
})

你也可以使用YourJS.fullNumber。例如,YourJS.fullNumber(Number.MAX_VALUE)的结果如下: 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

它也适用于非常小的数字。YourJS.fullNumber(Number.MIN_VALUE)返回: 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005

重要的是要注意,这个函数总是返回有限的数字作为字符串,但会返回非有限的数字(例如。NaN或无穷大)作为未定义的。

你可以在YourJS控制台进行测试。