Основная проблема заключается в том, что дробь 45/100 не имеет точного представления в виде последовательности 1/2 n членов. Фактически, большинство фракций, написанных с небольшим количеством цифр от 10 до 10, не имеют точного представления FP.
В результате фактическое число, которое вы получаете, очень близко, но не является точным приближением к вашему числу 10. Выходные результаты будут зависеть от того, куда вы округлите, но будут правильными, если при округлении вы сделаете что-нибудь менее разумное.
Если вы не округлите, точное число, которое вы получите, будет зависеть от того, где дробь отрублена, и от того, сколько цифр вы пытаетесь преобразовать. То, где дробится дробь, будет зависеть от того, сколько битов необходимо для представления мантиссы. Вот почему вы получаете разные результаты для x .45 в зависимости от x.
Этот вопрос постоянно возникает при переполнении стека. Я думаю, нам нужен faq с плавающей точкой.
Как ни странно, каждое (в диапазоне) целочисленное значение имеет точное представление в формате с плавающей запятой.