Преобразование вещественного числа в строку с заданной точностью

Задачи и их решение / Преобразование вещественного числа в строку с заданной точностью

Задача Преобразовать заданное вещественное число в строку символов с указанием количества разрядов после разделителя целой и дробной части.

В продолжение темы о преобразовании целого числа в строку символов рассмотрим вопрос преобразования в строку символов вещественного числа.

Перед началом преобразования представим число в нормированной форме, а затем переведем в цифру целую часть полученного числа. Из нормированного числа вычитаем целую часть и умножаем его на 10.

Функция принимает два аргумента:

  • преобразуемое число в формате double;
  • количество знаков после запятой

Возвращаемое значение - указатель на полученную после преобразования строку.

Реализация

#include <stdio.h>
#include <stdlib.h>
// Функция преобразования числа в строку
char* DoubleToStr(double n, int tolerance) {
  char s[40], t, *temp;
  double num;
  int i, j;
  i = tolerance;
  j = 0;
  num = n;
  if(num<0) {  // определяем знак числа
    num = -num;
    s[j] = '-';
    j++;
  }
  do {   // преобразуем к нормированной форме (если не меньше 1)
    num = num / 10;
    i++;
  } while((int)num > 0);
  num = num * 10;
  while(i > 0) {
    t = (int)num;   // выделяем цифру, соответствующую целой части
    s[j] = t | 0x30;
    i--; j++;
    if(i==tolerance) { // определяем положение десятичного разделителя
      s[j] = '.';
      j++;
    }
    num = num - (double)t; // вычитаем из числа целую часть
    num = num*10;  // переходим к следующему разряду
  }
  s[j] = '\0';
  j++;
  temp = (char*)malloc(j);  // выделяем память под возвращаемую строку
  for(i=0; i<j; i++)  // формируем возвращаемую строку
    temp[i] = s[i];
  return(temp);
}
int main() {
  double a;
  char *s;
  a=-123.0456789;
  for(int i=0; i<=10; i++) {
    s = DoubleToStr(a, i);
    printf(s);
    printf("\n");
  }
  getchar();
  return 0;
}

Результат выполнения
Преобразование вещественного числа в строку
Назад

Комментариев к записи: 3

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *