Я плохо разбираюсь в низкоуровневом программировании, но я хочу задать этот вопрос. Вот ведь на Python или других языках программирования 0.1 + 0.2 = 3.000...004 (также с умножением и т.д.). Почему десятичные дроби в программировании не записывают так: каждый символ числа (цифры, точка для десятичных дробей) в 2 байта (16 бит), кол-во битов с единицей в значении значит какое число (только первые 10 битов из 2-х байтов) например только первый бит - единица, только два первых - двойка и так до 9-тки, если все 10, то 0, а если все 16 битов, то это точка. А кол-во символов в числе, записывается в BigInt переменную (как в Java или JavaScript). Для примера я напишу число 6703.42109 (одна строка - один символ; 1-ый байт, пробел, 2-ой пробел; в скобочках буду писать значение этих байтов):
Это особенность реализации чисел с плавающей точкой и от языка не зависит, а только от оборудования.
Они были так задуманы для быстрой обработки при недостатке оперативной памяти.
Сейчас возможно было бы разумно перейти на числа с фиксированной точкой но обратная совместимость не пускает.
В те далёкие времена, когда вычислительные машины были большими и медленными, компьютеры, предназначенные для финансовых расчётов поддерживали аппаратную реализацию специального формата дробных чисел: двоично-десятичные числа, предназначенные для точных вычислений с десятичными дробями. В них для записи десятичных цифр, знака числа и точки использовалось по 4 бита на символ. Т.е. в 1 байт записывалось 2 символа числа.
Но по мере роста производительности компьютеров и увеличения длины аппартно поддерживаемых целых чисел надобность в отдельном аппаратном типе чисел для финансовых расчётов пропала.
А для тех редких случаев, когда требуются точные вычисления рациональных чисел, практически все современные языки программирования содержат специальные модули, программно реализующие как десятичные вычисления с фиксированной точкой, так и вычисления с дробными (числитель / знаменатель) числами.