Добавление чисел с плавающей точкой в ​​JavaScript - PullRequest
0 голосов
/ 07 июня 2018

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

Я понимаю, что 0.1, 0.2, 0.3, 0.4, 0.6, 0.7, 0.8, 0.9 даст бесконечную дробь вбинарная система как их знаменатели, поскольку ни 10, ни 5 не могут быть представлены степенями два.0.5 однако имеет знаменатель 2^1.

Когда я добавляю 0.2 + 0.4, я получаю 0.6000000000000001, когда я добавляю 0.1 + 0.5, я получаю 0.6.Я думал, что это потому, что в первой сумме я добавил две бесконечные дроби, тогда как во второй сумме я добавил с 0.5, который имеет конечное представление, с 0.1, который этого не делает.Однако, когда я добавляю 0.3 + 0.4, я получаю 0.7, чего я не ожидал, учитывая, что и 0.3, и 0.4 не имеют точных представлений, и при этом 0.7.

Я бы подумал, что, поскольку 0.5 является единственным десятичным числом от 0.1 до 0.9 (только в одном десятичном знаке) с конечным представлением, работа с любыми другими десятичными числами даст неточныйпредставление, но это не так.

Почему добавление некоторых десятичных знаков с одной точкой без конечного представления в двоичном виде дает точное представление, а некоторые нет?

1 Ответ

0 голосов
/ 07 июня 2018

При преобразовании числовых значений в строки в JavaScript по умолчанию используется , чтобы использовать только достаточное количество цифр для уникального различия значения Number .Это означает, что когда число отображается как «0,6», это не означает, что оно равно 0,6, просто оно ближе к 0,6, чем любое другое числовое значение, поэтому отображение только «0,6» говорит вам, что это уникальное числовое значение., что составляет 0,59999999999999997779553950749686919152736663818359375.

Если для числовых объектов задано значение 0.2 и 0.4, результаты фактически равны 0.20000000000000011102230246251565404236316680908203125 и 0,40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Когда вы добавляете их, результат составляет 0,600000000000000088817841970012523233890533447265625.Это отличается от 0,59999999999999997779553950749686919152736663818359375, и оно дальше от 0,6, поэтому JavaScript отображает его как «0,6000000000000001», чтобы показать, что оно отличается от числа, которое отображается как «0,6».

Когда для объектов Number установлено значение 0.1 и 0.5, результаты 0,1000000000000000055511151231257827021181583404541015625 и 0,5.Когда вы добавляете их, результатом будет 0,59999999999999997779553950749686919152736663818359375, то есть это число, которое JavaScript отображает как «0,6».

...