Я не могу получить правильный номер uint32 в JavaScript - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь преобразовать длинное число в единицу в JavaScript, но в результате я получил его, отличное от того, что у меня уже есть в c #.

C #:

var tt=431430059159441001;
var t=(UInt32)tt;//1570754153

ЯШ:

var arr =new Uint32Array(1);
arr[0]=431430059159441001;//1570754176

так что любое тело может объяснить, почему есть разница.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Это потому, что ваш числовой литерал представляет собой 64-разрядное целое число, и это не может быть представлено в JavaScripts обычном Number типе.Тип числа - это число с плавающей запятой с 64-битной точностью, которое может представлять только целочисленные значения вплоть до 2**53.Поэтому я бы порекомендовал просто не использовать такое огромное число.

Недавняя разработка в мире JavaScript - BigInt s.Если вы можете позволить себе их использовать, то ваш код легко исправить:

var t = Number(BigInt.asUintN(32, 431430059159441001n));
console.log(t); // 1570754153
0 голосов
/ 24 января 2019

Нельзя преобразовать 431430059159441001 в целое число без знака в .Максимальное значение UInt32 составляет 4294967295.Таким образом, присвоение var t=(UInt32)431430059159441001; дает ошибку компилятора.

также 431430059159441001 больше, чем максимальное значение числа с плавающей запятой (javascript содержит число с форматом с плавающей запятой)

0 голосов
/ 24 января 2019

Речь идет не о уинтах, а о плаваниях.JavaScript использует числа с плавающей запятой, и ваш номер превышает максимально допустимый диапазон целых чисел:

console.log(431430059159441001)
...