当JavaScript在字符串上下文中使用时,它将大于21位数的整数转换为科学计数法。我正在将整数作为URL的一部分打印出来。如何防止发生此转换?
当JavaScript在字符串上下文中使用时,它将大于21位数的整数转换为科学计数法。我正在将整数作为URL的一部分打印出来。如何防止发生此转换?
如果您不介意使用Lodash,它有toSafeInteger()函数。
_.toSafeInteger(3.2);
// => 3
_.toSafeInteger(Number.MIN_VALUE);
// => 0
_.toSafeInteger(Infinity);
// => 9007199254740991
_.toSafeInteger('3.2');
// => 3
我知道这已经过去很多年了,但最近我一直在处理类似的问题,我想发布我的解决方案。目前被接受的答案使用0填充指数部分,而我的尝试找到确切的答案,尽管通常对于非常大的数字来说并不完全准确,因为JS在浮点精度方面有限制。
这对于Math.pow(2, 100)
有效,返回正确的值1267650600228229401496703205376。
function toFixed(x) {
var result = '';
var xStr = x.toString(10);
var digitCount = xStr.indexOf('e') === -1 ? xStr.length : (parseInt(xStr.substr(xStr.indexOf('e') + 1)) + 1);
for (var i = 1; i <= digitCount; i++) {
var mod = (x % Math.pow(10, i)).toString(10);
var exponent = (mod.indexOf('e') === -1) ? 0 : parseInt(mod.substr(mod.indexOf('e')+1));
if ((exponent === 0 && mod.length !== i) || (exponent > 0 && exponent !== i-1)) {
result = '0' + result;
}
else {
result = mod.charAt(0) + result;
}
}
return result;
}
console.log(toFixed(Math.pow(2,100))); // 1267650600228229401496703205376
toFixed(Number.MAX_VALUE) == Number.MAX_VALUE
- manonthematNumber.MAX_SAFE_INTEGER
= 9007199254740991
,它只会失去精度。任何比这更高的数字都不会被精确存储,因此无法读取回来。 - Adassko您还可以使用 YourJS.fullNumber。例如,YourJS.fullNumber(Number.MAX_VALUE)
的结果如下所示:
179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
它也适用于非常小的数字。 YourJS.fullNumber(Number.MIN_VALUE)
返回:
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005
需要注意的是,此函数始终会返回有限数字作为字符串,但对于非有限数字(例如 NaN
或 Infinity
),它将返回 undefined
。
您可以在此处的YourJS控制台中测试它。
var num = Math.pow(2, 100);
var reconstruct = [];
while(num > 0) {
reconstruct.unshift(num % 10);
num = Math.floor(num / 10);
}
console.log(reconstruct.join(''));
function printInt(n) { return n.toPrecision(100).replace(/\..*/,""); }
存在一些问题:
number.toString(10.1)
:console.log(Number.MAX_VALUE.toString(10.1));
10.1
、10
或什么都不使用是等效的。 - OriolparseInt("5.645656456454545e+23", 10)
结果:5
。我曾经遇到过Oracle返回科学计数法的问题,但是我需要实际数字用于URL。我使用了PHP的一个技巧,通过减去零来获得正确的数字。
例如5.4987E7就是这个值。
newval = val - 0;
newval现在等于54987000