Несколько дней назад, экспериментируя с JavaScript, я обнаружил нечто странное, поэтому провел небольшое исследование и нашел ответы.
Я пишу эту статью в надежде, что некоторые из вас найдут ее полезной или узнают что-то новое.
Раньше я считал, что компьютеры лучше людей разбираются в математике, пока не попробовал сложить 0.1 + 0.2
и получил результат 0.30000000000000004
в консоли браузера.
Затем я выполнил сравнение 0.1+0.2===0.3
и получил результат false
.
Сначала я считал, что это ошибка в JavaScript, поэтому я попытался проделать то же самое на Java и Python и получил тот же результат в обоих случаях.
Проведя много исследований, я пришел к выводу, что это не ошибка.
Я выяснил, что это математика: арифметика с плавающей точкой.
Давайте немного углубимся, чтобы понять, что происходит за кулисами.
У компьютеров ограниченный объем памяти, поэтому им приходится выбирать между диапазоном и точностью.
Числа в JavaScript должны храниться в пределах 64 бит, что означает, что мы можем иметь целые числа с точностью до 15 цифр и максимум 17 цифр после десятичной точки. Это называется плавающей точкой, потому что нет фиксированного количества цифр до или после десятичной точки, что позволяет представлять широкий диапазон чисел, как больших, так и маленьких.
Проблема заключается в том, что компьютер использует систему Base-2, т.е. двоичную систему, в то время как люди используют систему Base-10, что приводит к ошибкам округления, когда вся память уже израсходована.
Это причина получения 0.1 + 0.2 = 0.30000000000000004
.
Спасибо, что прочитали эту статью; я не стал подробно описывать всю математику, но достаточно, чтобы вы поняли, что происходит.