翻译成另一个数字系统JS

时间:2017-05-19 13:54:49

标签: javascript math numbers


我有一个字符串,我需要将此字符串转换为另一个数字系统。
1959113774617397110401052 - 以十进制表示法到三十数字系统(10到36)。
如果我尝试使用此代码:

var master = 1959113774617397110401052;
parseInt(master, 10).toString(36);
//8v0wc05bcz000000

它无法正常工作。
你能帮助我知道,我的错误在哪里以及如何正确使用它。

谢谢!

2 个答案:

答案 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()

     

- MDN's notes on Number.MAX_SAFE_INTEGER

答案 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;
&#13;
&#13;