Очевидно Вы не поняли.Чтобы определить "половину младшего разряда точности" одним сложением не обойдешься.
В вашей программе Вы фактически написали округление для последовательного вычислителя
т е на одну десятичную цифру с переносом сигнала переполнения
Это конечно замечательно что Вы знаете как работал калькулятор
--------------------------------------------------
у Вас вот это int n = ((int)(fract*10.0+0.5))/10.0;
выполняется в цикле
т е в худшем случае количество этих умножений делений сложений и преобразований равно числу цифр после точки.
т е цифра за цифрой.
------------------------------------------------
но прикольно то,
что ESP 32 разрядный
и нет смысла для округления моделировать 4-разрядный калькулятор прошлого века.
-------------------------------------------------------
Если серьезно,то нет смысла засовывать округление в функцию преобразования числа в строку.
----------------------------------
Т е округление и преобразование в строку - это две независимые операции которые реализуются разными функциями.
---------------------------
Преобразовывать в строку можете чем угодно.
----------------------------------------------
А округление делается прибавлением к числу величины равной половине младшего разряда отображаемых после точки знаков.
---------------------------------------------
Т е для округление надо всего ОДНО сложение перед вызовом функции преобразования.
----------------------------------------
Пример я уже нарисовал выше.