(На самом деле, когда я запускаю код, я получил 18060.13
вместо 18060.125
, но я буду продолжать использовать последний в своем ответе.)
Могу ли я найти ближайший двойник значение для данного значения с плавающей запятой?
Вам, кажется, почему-то кажется, что ближайшее двойное значение для поплавка 18060.125
равно 18060.124145507813
? Это неправда. Ближайшее двойное значение для числа с плавающей точкой 18060.125
равно 18060.125
. Это значение может быть одинаково точно представлено double
и float
.
Почему приведение 18060.124145507813
к float
дает 18060.125
тогда?
Потому что ближайший float
к double
18060.124145507813
равен 18060.125
. Обратите внимание, что это наоборот из вашего понимания. Это не означает, что ближайшим double
к float
18060.125
является 18060.124145507813
, поскольку между двумя смежными float
значениями существует много double
значений.
Невозможно go обратно к "double
, от которого вы получили float
", потому что когда вы преобразуете в float
, вы теряете информацию. Вы конвертируете 64-битное значение в 32-битное. Эта информация не возвращается.
Почему тогда работает приведение 125.32f?
Поскольку float
не может представлять число 125.32 так же точно, как double
, поэтому при приведении к удвоению он пытается приблизить его еще дальше. Хотя может показаться, что float
может точно представлять 125.32
100%, это всего лишь иллюзия, созданная методом ToString
. Всегда форматируйте числа с плавающей запятой каким-либо способом форматирования, например string.Format
.