Разделение double на 2 части (целая и дробная) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть 3 типа:
bool znak; // Хранит знак если число в интервале ( -1 < n < 0 ) Т.к. если -0.1 преобразовать в long, то минус не сохранится. Для этого мы его сохраняем
           // true минус        false плюс
long a; // Целая часть
unsigned short b; // Дробная часть
И есть ещё 2 типа, которые нужно преобразовать:
double result_one = 1.3;
double result_two = -0.1;
И вот c & e нужно разделить на 2 типа, как это сделать?
// У меня вот есть пример, НО ...
if ((-1 < result_one) && (result_one < 0)) znak = 1; // Прекрасно сохраняет знак
a = (long)result_one; // ТУТ ПРОБЛЕМА! 1.3 округляет до 2
b = (unsigned short)(result_one - (double)(a)) * 10000; // По логике если целая часть нормально преобразует, то эта строчка сработает нормально ( НО ЭТО НЕ ТОЧНО )
// А с  -0.1  выводит просто  -0
 
А для вывода на экран использовать обратное преобразование:
// оно работает нормально
double _converter(bool znak, long a, unsigned shor b) {
    double result = ((double)b / 10000) + (double)abs(a);
    return znak ? (-1 * result) : (result);
}

Решение задачи: «Разделение double на 2 части (целая и дробная)»

textual
Листинг программы
    double b = 1.3;
    long a = b;
    long c = (long)(b * 100000) % 100000;

Объяснение кода листинга программы

  1. Объявляется переменная типа double с именем b и значением 1.3.
  2. Присваивается переменной типа long с именем a значение переменной b.
  3. Вычисляется значение выражения (long)(b * 100000) % 100000, приводимого к типу long с именем c.
  4. Полученное значение присваивается переменной c.

Оцени полезность:

12   голосов , оценка 4.5 из 5
Похожие ответы