Десятичные числа могут быть представлены точно, если у вас достаточно места - просто не с помощью плавающих двоичных номеров точек. Если вы используете плавающий тип десятичный тип (например, System.Decimal
в .NET), то множество значений, которые не могут быть представлены точно в двоичной плавающей запятой, могут быть точно представлены.
Давайте посмотрим на это по-другому - в базе 10, с которой вам, вероятно, будет комфортно, вы не можете точно выразить 1/3. Это 0.3333333 ... (повторяющийся). Причина, по которой вы не можете представить 0,1 в качестве двоичного числа с плавающей запятой, по той же причине. Вы можете точно представлять 3, 9 и 27, но не 1/3, 1/9 или 1/27.
Проблема в том, что 3 - простое число, которое не является фактором 10 . Это не проблема, когда вы хотите умножить число на 3: вы всегда можете умножить на целое число, не сталкиваясь с проблемами. Но когда вы разделите на число, которое является простым и не является фактором вашей базы, вы можете столкнуться с проблемой (и будет делать это, если вы попытаетесь разделить 1 по этому числу).
Хотя 0,1 обычно используется в качестве простейшего примера точного десятичного числа, которое не может быть представлено точно в двоичной плавающей точке, возможно, 0.2 является более простым примером, так как это 1/5 - и 5 - простое число, которое вызывает проблемы между десятичными и двоичными.
Некоторые типы плавающих десятичных точек имеют фиксированный размер например System.Decimal
, другие, такие как java.math.BigDecimal
, «сколь угодно велики», но в какой-то момент они достигнут предела, будь то системная память или теоретический максимальный размер массива. Однако это совершенно отдельный момент для основного ответа. Даже если у вас было действительно произвольно большое количество бит, с которыми вы играли, вы все равно не могли бы представлять десятичные числа 0,1 точно в виде плавающего двоичного представления. Сравните это с другим способом: заданное произвольное число десятичных цифр, вы можете точно представлять любое число, которое точно представляется как плавающая двоичная точка.