Oleg Ambrosevich
Oleg Ambrosevich

Reputation: 21

Translation into another number system JS


I have a string and I need to convert this string into another number system.
1959113774617397110401052 - in Decimal notation to thirty-tensary number system (10 to 36).
If i try to use this code:

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

It doesn't work properly.
Can you help me to know, where is my mistake and how to use this correctly.

Thank you!

Upvotes: 1

Views: 115

Answers (2)

Lutz Lehmann
Lutz Lehmann

Reputation: 25992

You would need to use a multi-precision library like Decimal.js for integer calculations that exceed the range of signed Int32 resp. the continuous integer range representable by 64bit floats. As example:

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>

Upvotes: 1

James Donnelly
James Donnelly

Reputation: 128791

The maximum integer JavaScript can safely handle is 9007199254740991. This is what we get if we call Number.MAX_SAFE_INTEGER. Your number, on the other hand, is significantly larger than this:

9007199254740991
1959113774617397110401052

Because of this, JavaScript isn't able to safely perform mathematical calculations with this number and there's no guarantee that you'll get an accurate result.

The MAX_SAFE_INTEGER constant has a value of 9007199254740991. The reasoning behind that number is that JavaScript uses double-precision floating-point format numbers as specified in IEEE 754 and can only safely represent numbers between -(253 - 1) and 253 - 1.

Safe in this context refers to the ability to represent integers exactly and to correctly compare them. For example, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 will evaluate to true, which is mathematically incorrect. See Number.isSafeInteger() for more information.

MDN's notes on Number.MAX_SAFE_INTEGER

Upvotes: 1

Related Questions