Если ваш показатель степени десятичный (т. Е. Он представляет 10 ^ X), вы можете точно представить 0,1 - однако большинство форматов с плавающей запятой используют двоичные показатели (то есть они представляют 2 ^ X). Поскольку нет целых чисел X
и Y
, таких как Y * (2 ^ X) = 0.1
, вы не можете точно представить 0,1 в большинстве форматов с плавающей запятой.
Некоторые языки имеют типы с обоими показателями. В C #, например, существует тип данных с точным именем decimal
, который является форматом с плавающей запятой с десятичной экспонентой, поэтому он будет поддерживать сохранение числа типа 0,1, хотя имеет и другие необычные свойства: тип decimal
может различать между 0.1
и 0.10
, и всегда верно, что x + 1 != x
для всех значений x
.
Однако для наиболее распространенных целей C # также имеет типы float
и double
с плавающей запятой, которые не могут точно хранить 0,1, поскольку они используют двоичный показатель степени (как определено в IEEE-754). Бинарные типы с плавающей запятой используют меньше памяти, быстрее, потому что их легче реализовать, и для них определено больше операций. В общем случае decimal
используется только для финансовых значений, где важно точное представление всех десятичных значений, а хранение, скорость и диапазон операций не имеют значения.