Числа меняют значения - PullRequest
       1

Числа меняют значения

2 голосов
/ 21 февраля 2012

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

Я пытался сделать это:

var 
    str = 'asdf_10150663120210603',
    num = +str.split('_')[1];

console.log(num);
// 10150663120210603 expected
// 10150663120210604 actually resulting

И я попытался в Node & Chrome Inspector просто вывести число.

console.log(10150663120210603);
// 10150663120210604 actually resulting

Есть ли какой-нибудь безумный способ, хакерский или нет, сделать переменную равной 10150663120210603. Или я должен использовать строки?

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Числа с плавающей точкой в ​​JavaScript являются 64-битными значениями с плавающей точкой IEEE-754.У них всего 52 бита для мантиссы, а для вашего числа требуется 54 бита для представления.Он просто округляется.

Если он округлен до 10150663120210604, его можно представить в 52 битах.

2 голосов
/ 21 февраля 2012

JavaScript использует IEEE 754 формат с плавающей запятой двойной точности для представления всех чисел, и этот формат может представлять ровно целые числа до 2 ^ 52. Поскольку ваше число больше наибольшего точно представимого целого числа, оно округляется.

1 голос
/ 21 февраля 2012

JavaScript представляет числа в формате IEEE-754 с двойной точностью (64 бита). Насколько я понимаю, это дает вам точность 53 бита, или от пятнадцати до шестнадцати десятичных цифр. Ваш номер содержит больше цифр, чем может выдержать JavaScript, поэтому вы получите приблизительное значение.

Если вам не нужно выполнять математические операции над числами, то самый простой обходной путь - это просто представить их в виде строк.

В противном случае вы можете использовать big int library (или реализовать свою собственную).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...