Почему console.log не отображает значение с плавающей запятой IEEE-754 для назначенного var?

133
9

Я знаю, что значения с плавающей запятой в JavaScript хранятся в двоичном формате base-2, указанном в IEEE 754. Для меня это означает, что, когда я присваиваю значение литерала .1 переменной, фактическое значение будет равно 0.100000001490116119384765625 (или некоторые высокоточное число вроде этого - моя математика может быть неправильной).

Но в console.log от этого предположения, console.log хранимой ценности не отражает этого. Следующий код: var a = 0.1; console.log(a); var a = 0.1; console.log(a);

... когда выполняется в Chrome и, возможно, в других браузерах, будет выводиться: 0.1

Я бы ожидал, что это будет: 0.100000001490116119384765625

Значит ли значение a в этой точке 0.1 или 0.1000000...? Если последнее, то каким способом console.log() показывает 0.1? Меня интересует, что происходит здесь под капотом. (Например, JS хранит текстовое представление числа в переменной?)

Для вас, добросовестных администраторов, которые могут быть немного быстрыми, чтобы "отметить как дублирующиеся", обратите внимание, что я задаю противоположность более распространенным вопросам и вариантам "Почему я вдруг вижу эти дурацкие высокоточные номера?"

спросил(а) 2021-01-19T18:22:50+03:00 6 месяцев, 1 неделя назад
1
Решение
89

Форматирование значений по плавающей запятой по умолчанию для JavaScripts использует только десятичные цифры, чтобы однозначно отличать значение от соседних значений с плавающей запятой.

Этот вопрос является дубликатом, за исключением того, что использует console.log, который находится вне JavaScript. Стандарт JavaScript, спецификация языка ECMAScript 2017 не упоминается в console. Эта функция предоставляется поставщиками в качестве расширения. Поэтому каждый поставщик может реализовать свое поведение. Однако несколько вероятно, что использование console.log с Number будет использовать обычное поведение ToString, в результате чего объяснение преобразования объясняется в ответе, указанном выше.

ответил(а) 2021-01-19T18:22:50+03:00 6 месяцев, 1 неделя назад
64

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

var a = 0.1;
console.log(a.toPrecision(21))

ответил(а) 2021-01-19T18:22:50+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема