Проблема с вашим начальным значением - float
в любом случае точна только до 7 значащих десятичных цифр:
float f = 1056964.63f;
Console.WriteLine(f); // Prints 1056965
Так что на самом деле пример second является неожиданным в некоторыхпутей.
Теперь значение точное в f
равно 1056965,625, но это значение, заданное для всех значений от 1056964,563 до 1056964,687 - так что даже часть ".6" невсегда правильно.Вот почему документы для состояния System.Single
:
По умолчанию значение Single содержит только 7 десятичных цифр точности, хотя внутренне поддерживается максимум 9 цифр.
Дополнительная информация по-прежнему сохраняется при преобразовании в double
, потому что это может сохранить ее, вообще не «интерпретируя» ее - где преобразование в десятичную форму (для печати или для типа decimal
) проходиткод, который знает, что он не может "доверять" этим двум последним цифрам.