Необходимо создать 2 числа из одного с плавающей точкой. float 15.635 = int 15 | int 635. Проблема состоит в том, что необходимо найти точку,но ведь для этого необходимо создать из него строку и парсить по ней, но тип float нельзя перевести в строку, а даже если сделать это, то как разделить(желательно сразу с вариантом приравнивания)
float f = 15.635;
int i_part = f;
int f_part = (f - i_part) * 1000 + 0.5;
printf("%d.%03d", i_part, f_part);
Само собой, подразумевается, что целая часть умещается в тип int
.
Updated
как узнать количество знаков дробной части?
Как уже объясняли, числа с плавающей точкой надёжно не представляют десятичные дроби, так что достоверно узнать количество знаков после десятичного разделителя можно только округлив число до какой-либо адекватной величины, а затем избавившись от лишнего, например как-то так:
int i_part = f;
const int max_f_digits = 5;
int f_part = (f - i_part) * pow(10, max_f_digits) + 0.5;
int f_digits=max_f_digits;
if (f_part) {
while (f_part%10 == 0) {
f_part/=10;
f_digits--;
}
} else {
f_digits=1;
}
printf("%d.%0*d\n", i_part, f_digits, f_part);
Я тут подумал на досуге. Задание какое-то странное. К примеру, рассмотрим три числа:
15.1
15.01
15.001
Согласно заданию, дробная часть каждого из этих чисел должна быть представлена в виде:
1
01
001
Но число 001 выгруженное в int равно числу 1, так как лидирующие нули отбрасываются как незначащие. Получается, что дробные части у чисел 15.1, 15.01, 15.001 выгруженные в целое по предложенному алгоритму будут равны между собой и равны единице. А это, очевидно, не тот результат, который ожидается.
Вы уточните, что именно Вам нужно. Потому, что выгрузка дробной части в целое не может быть однозначной из-за наличия лидирующих нулей в дробной части.
От этой неоднозначности можно избавится, если, как Вы пишите, ограничить число знаков в дробной части не более 5. Тогда можно выгружать дробную часть в целое исходя из этого. Но при этом 15.635 будет равно 15.63500 и дробная часть будет 63500, а не 635. Соответственно в вышеприведенных примерах числа будут такие:
15.10000
15.01000
15.00100
И их дробные части, выгруженные в целое, будут такие:
10000=10000
01000=1000
00100=100
Или Вы действительно получаете строку, а не число. Тогда, конечно, можно распарсить строку и выделить строку целого и строку дробной части. Но это просто задача разбора строки, а не задача разбора числа float. И на выходе Вы получите не целые числа, а опять же строки.
UPD1:
И да, еще же есть отрицательные числа. Или в этом случае рассматриваются только положительные числа?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь написать элементарное окно авторизации (в качестве обучения) и столкнулся со следующей проблемойИмеется определенная кнопка в cpp-файле...
Почему уже при создании множества, вылетает ошибка, хотя не был изменен массив?