Для фиксированной точки просто умножьте числитель на 10 перед делением. Для плавающей запятой просто используйте деление, а затем modf
, чтобы получить дробную часть. В любом случае, преобразуйте в строку, затем отформатируйте как предпочитаете (1 десятичный знак).
В C вы можете сделать что-то общее, которое обрабатывает фиксированную или плавающую точку, используя _Generic
.
Простой пример без обработки ошибок:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
char* strfract_int (char* dst, int n, int d)
{
sprintf(dst, "0.%d", n*10 / d);
return dst;
}
char* strfract_double (char* dst, double n, double d)
{
double dummy;
sprintf(dst, "%.1f", modf(n/d, &dummy) );
return dst;
}
#define strfract(dst, n, d) \
_Generic((n), \
int: strfract_int, \
double: strfract_double)(dst,n,d) \
int main (void)
{
char buf [100];
puts( strfract(buf, 1, 3) );
puts( strfract(buf, 2, 5) );
puts( strfract(buf, 1.0, 3.0) );
puts( strfract(buf, 2.0, 5.0) );
}
В защищенной программе проверьте деление на ноль, результат malloc и т. Д. И т. Д.