当在字符串上下文中使用时,JavaScript将超过21位的整数转换为科学符号。我打印了一个整数作为URL的一部分。我怎样才能阻止这种转变的发生?
当前回答
还有一个可能的解决方案:
function toFix(i){
var str='';
do{
let a = i%10;
i=Math.trunc(i/10);
str = a+str;
}while(i>0)
return str;
}
其他回答
这就是我最终使用的从输入中获取值的方法,扩展小于17位的数字并将指数数转换为x10y
// e.g.
// niceNumber("1.24e+4") becomes
// 1.24x10 to the power of 4 [displayed in Superscript]
function niceNumber(num) {
try{
var sOut = num.toString();
if ( sOut.length >=17 || sOut.indexOf("e") > 0){
sOut=parseFloat(num).toPrecision(5)+"";
sOut = sOut.replace("e","x10<sup>")+"</sup>";
}
return sOut;
}
catch ( e) {
return num;
}
}
你可以用从指数模块。它是轻量级的,并且经过了充分的测试。
import fromExponential from 'from-exponential';
fromExponential(1.123e-10); // => '0.0000000001123'
有号码。固定,但如果数字>= 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");
我有同样的问题与甲骨文返回科学符号,但我需要一个url的实际数字。我只是用了一个PHP技巧减去0,得到了正确的数字。
例如,5.4987E7是val。
newval = val - 0;
Newval现在等于54987000
下面的解决方案绕过了非常大和非常小的数字的自动指数格式。这是outis的解决方案,有一个错误修正:它不适用于非常小的负数。
function numberToString(num) { let numStr = String(num); if (Math.abs(num) < 1.0) { let e = parseInt(num.toString().split('e-')[1]); if (e) { let negative = num < 0; if (negative) num *= -1 num *= Math.pow(10, e - 1); numStr = '0.' + (new Array(e)).join('0') + num.toString().substring(2); if (negative) numStr = "-" + numStr; } } else { let e = parseInt(num.toString().split('+')[1]); if (e > 20) { e -= 20; num /= Math.pow(10, e); numStr = num.toString() + (new Array(e + 1)).join('0'); } } return numStr; } // testing ... console.log(numberToString(+0.0000000000000000001)); console.log(numberToString(-0.0000000000000000001)); console.log(numberToString(+314564649798762418795)); console.log(numberToString(-314564649798762418795));