Разбор Javascript int64 - PullRequest
       76

Разбор Javascript int64

16 голосов
/ 18 марта 2011

Как я могу преобразовать длинное целое число (в виде строки) в числовой формат в Javascript без его округления в javascript?

var ThisInt = '9223372036854775808'
alert(ThisInt+'\r' +parseFloat(ThisInt).toString()+'\r' +parseInt(ThisInt).toString());

Мне нужно выполнить сложение, прежде чем вернуть его обратно в виде строки, и я бы предпочел не разбивать его на два, если это вообще возможно.

Ответы [ 5 ]

25 голосов
/ 18 марта 2011

Все Числа в Javascript имеют 64-битную "двойную" точность IEE754 с плавающей запятой.

Наибольшее положительное целое число, которое может поэтомубыть точно представленным 2 ^ 53 - 1. Остальные биты зарезервированы для показателя степени.

Ваш номер ровно в 1024 раза больше этого, поэтому теряет 3 десятичных знака точности.Его просто нельзя представить точнее.

В ES6 можно использовать Number.isSafeInteger( # ) для проверки числа, чтобы определить, находится ли оно в безопасном диапазоне:

var ThisInt = '9223372036854775808'; 
console.log( Number.isSafeInteger( parseInt( ThisInt ) ) );

Существует также библиотека BigInteger , которая должна быть в состоянии помочь, однако, избегая необходимости выполнять всю последовательность действий..

РЕДАКТИРОВАТЬ 2018/12 теперь в Chrome и NodeJS появился собственный класс BigInt (и новый буквальный синтаксис).

1 голос
/ 18 марта 2011

Вы не можете сделать это со стандартным Javascript.Но, как всегда, есть небольшая изящная библиотека, которая поможет нам, в этом случае BigInt.js , которая позволит вам использовать целые числа произвольной точности.

1 голос
/ 18 марта 2011

С небольшой помощью рекурсии вы можете напрямую увеличить десятичную строку, будь то 64-битное число или более ...

/**
 * Increment a decimal by 1
 *
 * @param {String} n The decimal string
 * @return The incremented value
 */
function increment(n) {
    var lastChar = parseInt(n.charAt(n.length - 1)),
        firstPart = n.substr(0, n.length - 1);

    return lastChar < 9
        ? firstPart + (lastChar + 1)
        : firstPart
            ? increment(firstPart) + "0"
            : "10";
}
0 голосов
/ 18 марта 2011

Вы пытались использовать класс Number?
var num = new Number(parseFloat(ThisInt))

0 голосов
/ 18 марта 2011

Просто используйте Number (ThisInt) для этого вместо Int или float

...