создать 2 int числа из одного float

154
15 декабря 2019, 01:40

Необходимо создать 2 числа из одного с плавающей точкой. float 15.635 = int 15 | int 635. Проблема состоит в том, что необходимо найти точку,но ведь для этого необходимо создать из него строку и парсить по ней, но тип float нельзя перевести в строку, а даже если сделать это, то как разделить(желательно сразу с вариантом приравнивания)

Answer 1
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);
Answer 2

Я тут подумал на досуге. Задание какое-то странное. К примеру, рассмотрим три числа:

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:

И да, еще же есть отрицательные числа. Или в этом случае рассматриваются только положительные числа?

READ ALSO
Изменение цвета кнопки при нажатии и уменьшение размера поля ввода QLineEdit при обрамлении в Qt Creator 4.8.1 C++

Изменение цвета кнопки при нажатии и уменьшение размера поля ввода QLineEdit при обрамлении в Qt Creator 4.8.1 C++

Пытаюсь написать элементарное окно авторизации (в качестве обучения) и столкнулся со следующей проблемойИмеется определенная кнопка в cpp-файле...

172
Почему std::multiset не работает с константами?

Почему std::multiset не работает с константами?

Почему уже при создании множества, вылетает ошибка, хотя не был изменен массив?

136
Как добавить запись в JSON Qt C++

Как добавить запись в JSON Qt C++

Есть Json такой структуры:

146