2015-04-06 3 views
8

Этот вопрос просто для любопытства.Почему это так: parseInt (1111111111111111,2) === parseInt (11111111111111111,2)

Через консоль

parseInt(1111111111111111,2) // 16 1's 

возвращает

65535 

и

parseInt(11111111111111111,2) // 17 1's 

возвращает

65535 

Также

//   16 1's       17 1's 
if(parseInt(1111111111111111,2) === parseInt(11111111111111111,2)) 

возвращает

true 

Где подвох?

Благодаря

+3

Подсказка: попробуйте просто '11111111111111111'. – SLaks

+0

Первый аргумент для 'parseInt' ** должен быть ** строкой. Это GIGO. – zerkms

+2

'(1111111111111111) .toString() ===" 1111111111111111 "и' (11111111111111111) .toString() === "11111111111111112" '. 'parseInt' ожидает строку, а' 2' является недопустимой двоичной цифрой. –

ответ

8

11111111111111111 десятичное число буквальным для ряда, который является слишком большим для Javascript, чтобы закодировать точно.

parseInt(, 2) будет останавливаться на первом символе, который не является 1, или 0, поэтому он останавливает синтаксический анализ, когда точность ухудшается.

Измените это на строку, и все будет в порядке.

+0

Вы уверены? Я думал, что JavaScript использует 64-битные целые числа? –

+1

@self: нет; он использует 64-битные _floats_. Существует важная разница. – SLaks

+3

@ william.taylor.09 java! ================= javascript – zerkms

Смежные вопросы