У вас есть интересное обсуждение о строковом форматировании чисел с плавающей точкой.
Только для справки:
Для представления вашего номера требуется 24 бита, что означает, что вы израсходовали всю мантиссу с плавающей точкой (23 бита + 1 подразумеваемый бит).
Функция Single.ToString () в конечном итоге реализована встроенной функцией, поэтому я не могу точно сказать, что происходит, но я предполагаю, что она использует последнюю цифру для округления всей мантиссы.
Причиной этого может быть то, что вы часто получаете числа, которые не могут быть представлены точно в двоичном виде, поэтому вы получите длинную мантиссу; например, 0,01 представляется внутренне как 0,00999 ... как вы можете видеть написав:
float f = 0.01f;
Console.WriteLine ("{0:G}", f);
Console.WriteLine ("{0:G}", (double) f);
округляя седьмую цифру, вы получите обратно "0,01", чего вы и ожидали.
Для того, что вы видели выше, цифры, состоящие только из 7 цифр, не будут показывать эту проблему, как вы уже видели.
Просто чтобы прояснить: округление происходит только тогда, когда вы преобразовываете свое число в строку: ваши вычисления, если таковые имеются, будут использовать все доступные биты.
Плавающие имеют точность 7 цифр внешне (9 внутри), поэтому, если вы превысите это значение, то округление (с потенциальными причудами) будет автоматическим.
Если вы опустите число до 7 цифр (например, 1 слева, 6 справа), то это сработает, и преобразование строк также будет выполнено.
Что касается бонусных баллов:
Почему ты? Потому что этот код был «готов напасть на тебя».
(Вулкан ... удар ... хорошо.
Lamest.
Punt.
Когда-нибудь)