Разделение 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;
Объяснение кода листинга программы
- Объявляется переменная типа double с именем
bи значением 1.3. - Присваивается переменной типа long с именем
aзначение переменнойb. - Вычисляется значение выражения (long)(b * 100000) % 100000, приводимого к типу long с именем
c. - Полученное значение присваивается переменной
c.