Форматирование числа с плавающей запятой довольно нетривиально. Поиск, например. для алгоритма Dragon4 ( здесь есть один результат ).
Очень, very наивно, вы можете попробовать это:
< 0
). Предположим, что в дальнейшем число является положительным вещественным. >= 1
, усечь и использовать знакомое целочисленное форматирование для печати целой части. (Для этого должна быть машинная инструкция для любого оборудования, имеющего блок с плавающей точкой.) Если допустимо печатать как 1.d1d2d3d4d5 ... * 2 ^ e1e2e3, то преобразование числа с плавающей запятой в десятичное (-ish) представление может быть простым. Реализация может быть найдена здесь .
Если вам нужно научное представление 1.d1d2 ... * 10 ^ e1e2e3, тогда наивный подход к многократному делению на 10 и извлечению цифр из номер, который у вас есть в формате с плавающей запятой. Вам понадобится какая-то многоцелевая целочисленная библиотека. (Повторно умножить на 10, чтобы извлечь цифры после точки.)
Решение Kerrek SB верное. Но вы можете сделать это быстрее без какого-либо цикла (или меньше циклов). Просто умножьте часть дроби на 10precision. Уменьшение числа или умножений также уменьшает кумулятивную ошибку, если вы выполняете математику с типом с плавающей точкой. Для точного преобразования вам нужно использовать тип с плавающей запятой с более высокой точностью.
Например, вы хотите преобразовать 0.1234567 с 5 цифрами точности, умножить число на 10000 и получить int-часть. Если требуется округление, умножьте его на 100000 и округлите последнее число
printf("%1.2f",99.999999996);
определял бы, что две цифры слева от десятичной точки, преобразуют значение в строку («100,00»), а затем ...
– supercat
26 July 2013 в 17:07
int( frac(x)*10000 )
в строку, по одной десятичной цифре за раз! Но он будет использовать целочисленное деление вместо умножения FP ( Как напечатать целое число в Программе уровня сборки без printf в библиотеке c? ). (Если вы не можете использовать printf
для целочисленных форматов, но не плавать, но он должен зацикливаться внутри.)
– Peter Cordes
30 June 2018 в 04:02