Так же, как числа-10 должны округляться при их преобразовании в основание-2, можно округлить число при преобразовании из основания-2 в основание-10. Как только у числа есть представление с основанием-10, его можно снова округлить простым способом, посмотрев на цифру справа от той, которую вы хотите округлить.
Хотя в вышеприведенном утверждении нет ничего плохого, есть гораздо более прагматичное решение. Проблема заключается в том, что двоичное представление пытается максимально приблизиться к десятичному числу, даже если этот двоичный файл меньше десятичного. Величина ошибки находится в пределах [-0,5,0,5] младших значащих бит (LSB) от истинного значения. Для округления вы бы предпочли, чтобы он был в пределах [0,1] LSB, чтобы ошибка всегда была положительной, но это невозможно без изменения всех правил математики с плавающей запятой.
Единственное, что вы можете сделать, это добавить 1 LSB к значению, чтобы ошибка находилась в пределах [0.5,1.5] LSB от истинного значения. Это менее точно в целом, но только на очень маленькое количество; когда значение округляется для представления в виде десятичного числа, гораздо более вероятно, что оно будет округлено до правильного десятичного числа, поскольку ошибка всегда положительна.
Чтобы добавить 1 LSB к значению перед округлением, см. Ответы на этот вопрос . Например, в Visual Studio C ++ 2010 процедура будет такой:
Round(_nextafter(37.785,37.785*1.1),0.01);