Если я преобразую одиночный s в десятичный d, я заметил, что его битовое представление отличается от представления десятичной дроби, созданного напрямую.
Например:
Single s = 0.01f;
Decimal d = 0.01m;
int[] bitsSingle = Decimal.GetBits((decimal)s)
int[] bitsDecimal = Decimal.GetBits(d)
Возвращает (средние элементы удалены для краткости):
bitsSingle: [0] = 10 [3] = 196608 bitsDecimal: [0] = 1 [3] = 131072
Оба эти числа являются десятичными числами, которые оба (кажущиеся) точно отображают 0,01:
Глядя на спецификацию, нет света, кроме, возможно:
§4.1.7. В отличие от типа данных с плавающей точкой и двойными данными десятичная дробная числа, такие как 0,1, могут быть представлены точно в десятичной представление.
Предполагая, что это как-то повлияло на одиночный, неспособный точно представлять 0.01 перед преобразованием, поэтому:
- Почему это неточно к моменту завершения преобразования?
- Почему у нас есть два способа представления 0.01 в одном и том же типе данных?