我有一个字符串,我需要将此字符串转换为另一个数字系统。
1959113774617397110401052 - 以十进制表示法到三十数字系统(10到36)。
如果我尝试使用此代码:
var master = 1959113774617397110401052;
parseInt(master, 10).toString(36);
//8v0wc05bcz000000
它无法正常工作。
你能帮助我知道,我的错误在哪里以及如何正确使用它。
谢谢!
答案 0 :(得分:1)
JavaScript可以安全处理的最大整数是9007199254740991
。如果我们拨打Number.MAX_SAFE_INTEGER
,这就是我们得到的。另一方面,您的号码远远大于此:
9007199254740991
1959113774617397110401052
因此,JavaScript无法使用此数字安全地执行数学计算,并且无法保证您将获得准确的结果。
MAX_SAFE_INTEGER
常量的值为9007199254740991.该数字背后的原因是JavaScript使用IEEE 754中指定的双精度浮点格式数,并且只能安全地表示 - (2 53 - 1)和2 53 - 1。此上下文中的安全性是指能够准确表示整数并正确比较它们的能力。例如,
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
将评估为true,这在数学上是不正确的。有关详细信息,请参阅Number.isSafeInteger()
。
答案 1 :(得分:1)
您需要使用像Decimal.js这样的多精度库来进行超出已签名Int32分配范围的整数计算。由64位浮点数表示的连续整数范围。例如:
var astr = '1959113774617397110401052'
var a =new Decimal(astr)
var out = '';
while( a > 0 ) {
var d = a.mod(36).toNumber();
a = a.divToInt(36);
if(d>9) d=d+39; // d+7 for upper case
out = String.fromCharCode(48+d)+out
}
var my_div = document.getElementById("my_div")
my_div.innerHTML += astr+" in base 36 is "+out;

<script src="https://raw.githubusercontent.com/MikeMcl/decimal.js/master/decimal.min.js"></script>
<div id="my_div"></div>
&#13;