ПОЧЕМУ 0.3 - 0.2 НЕ РАВНО 0.1?
В нашем сообществе часто встречаю подобные вопросы. И настало время разобраться с этим. Мы ведь с вами будем копать в глубь.
(Возможно это будет целая рубрика статей на подобные темы, так как за один пост не описать)
Что мы имеем:
📌 Числа
0.3, 0.2, 0.1, ... - это числа. Которыми мы оперируем. Углубляемся дальше.
Число это основное понятие математики.
Развновидности чисел:
- Натуральные
- Целые
- Рациональные
- Действительные (вещественные)
- Комплексные
📌 Вещественные числа
Сегодня пока что остановимся (немного коснемся) понятия именно вещественного числа или действительного числа (от лат. realis — действительный).
Наглядно понятие вещественного числа можно представить при помощи числовой прямой.
Если на прямой выбрать направление, начальную точку и единицу длины для измерения отрезков, то каждому вещественному числу можно поставить в соответствие определённую точку на этой прямой.
Вследствие этого соответствия термин «числовая прямая» обычно употребляется в качестве синонима множества вещественных чисел.
📌 Представление чисел в компьютере
Замечание:
Количество вещественных чисел бесконечно, а память в компьютере фиксированного размера - конечна. Это означает что невозможно создать способ кодирования, который позволяет упаковать все множество (бесконечное) вещественных чисел в этот объем памяти. Поэтому получаются ошибки округления при расчетах
Числа в компьютере хранятся в регистрах и ячейках памяти с ограниченным количеством разрядов. Для решения большинства задач числа внутри компьютера достаточно представить в виде целых и вещественных чисел.
Представление целых чисел достаточно простое — выделяется необходимое количество разрядов для размещения чисел. Для представления вещественных чисел используются две формы записи: число с фиксированной точкой и число с плавающей точкой.
📌 JavaScript
Выражение, вроде "0.3 - 0.2 неравно 0.1", мы видим, представление в привычной нам десятичной системе счисления.
Но компьютер оперирует двоичными числами. То есть десятичные операнды имеют двоичное представление (последовательность нулей и единиц).
Некоторые операнды в двоичной форме могут представлять собой либо очень большие либо бесконечные дроби (чем и являются вещественные числа).
Так вот, числа то бесконечные, но на их хранение выделяется ограниченное пространство памяти.
В результате операции происходит округление, обрезание числа в соответствии со стандартом. Накопленные округления могут давать на выходе подобные погрешности, неточные вычисления.
Все числа в JavaScript, как целые так и дробные, имеют тип Number и хранятся в 64-битном формате IEEE-754, также известном как «double precision».
IEEE-754 - широко используемый стандарт IEEE, описывающий формат представления чисел с плавающей точкой. Используется в программных (компиляторы с разных языков программирования) и аппаратных (CPU и FPU) реализациях арифметических действий (математических операций).
IEEE - (англ. Institute of Electrical and Electronics Engineers) (I triple E — «Ай трипл и») — международная некоммерческая ассоциация специалистов в области техники, мировой лидер в области разработки стандартов по радиоэлектронике, электротехнике и аппаратному обеспечению вычислительных систем и сетей.