Как получить число идущее после запятой введённой переменной типа double в C++? (например, ввели 14.25 - вывело 25)

166
05 августа 2018, 07:00

Примерно продумал синтаксис, но выводит число неправильно. Алгоритм такой: число оставить без его целой части, далее умножать на 10 до тех пор, пока разность nmb - (int)nmb не окажется равной нулю.

#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
double nmb;
cin >> nmb;
// Кол-во чисел после запятых равно: 
cout << (nmb - (int)nmb) << endl;
// Само число равно
while (nmb - (int)nmb != 0)
{
    cout << nmb << endl;
    nmb *= 10;
}
cout << "Result number is " << nmb << endl;
system("pause");
}

Мне нужно просто то, что:

1) Убирает лишние цифры/нули (желательно объяснение)

2) Не является чем-либо "заумным" (например, не функции из языка Си)

И ещё нужен тот, кто:

1) Поможет понять причину того, почему у меня код не работает.

2) Тот, кто поправит его, если требуется или подскажет решение моей проблемы.

3) Скажет, есть ли что-то проще ваших Сишных функций: поймите, я новичок.

Answer 1

Скажите, а

int nmb, frc;
char dot;
cin >> nmb >> dot >> frc;

вас не устроит? После этого то, что вам нужно - будет в frc...

Проблема одна - что вы хотите получить для 14.0025 - тоже 25?

Answer 2
int fractional_part_as_int(double number, int number_of_decimal_places) {
    double dummy;
    double frac = modf(number,&dummy);
    return round(frac*pow(10,number_of_decimal_places));
}

c++ convert a fractional part of a number into integer

Answer 3
double nmb; 
// инициализиация  обьекта `nmb`  
std::string s = to_string(nmb);
// удалим последные нули
size_t pos = s.find_last_not_of('0');
s.erase(pos +1);
// вывод дробной части
std::cout << stoi( s.substr(s.find('.') + 1));

или просто:

string s;
cin >> s;
std::cout << stoi( s.substr(s.find('.') + 1));

если нужны все цифры, а не только те, который выдает double по умолчанию

Дополнение по просьбе автора:

cout << (nmb - (int)nmb) << endl; 

тут мысль у вас правильная, но вы просто выводите значение, а nmb остается с прежним значением, так как выражение что вы выводите хранится в другой временной переменной(обьекте), которая (ый) уничтожается после вывода. Поэтому результат нужно хранить в каком то обьекте. И, так, как первоначальное значение nmb вам больше не нужно, то можете хранить в нем, чтобы не обьявить другой обьект.

Теперь про самую главную ошибку:

while (nmb - (int)nmb != 0)... 

Как я описал выше, nmb не изменил свое значение, и nmb - (int)nmb никогда не будет ноль, тем более, что вы в цикле умножаете еще на 10. Или это значение будет всегда ноль, если дробная часть nmb нулевая. Я напишу, на основе вашего кода, как будет правильно:

double nmb;
cin >> nmb;
// получаем дробную часть
nmb -= (int)nmb; // теперь nmb изменил свое значение(убрали целую часть
// хотя я тут еще не учел, что значение nmb может быть отрицательным 
cout << nmb << endl;
// Само число равно
int k = nmb;
while (!k  || k%10 )
{
    nmb *= 10;
    k = nmb;
}  
k = nmb/10;

while (!k || k % 10 ) равносильно выражению

while (k == 0  || k % 10 != 0)

условие k == 0 заставляет умножать на 10 пока nmb не имеет целой части условие k%10 != 0 заставляет дальше выполнить операцию, пока число не делится на 10, т.е. пока не дойдем до последных нулей. И, так как, цикл прекращается после того, как число имеет ноль в конце, то для получения результата, нужно значение делить на 10 следовательо выводим:

cout << "Result number is " << k << endl;
Answer 4

https://ideone.com/Re3Wjx

#include <cstdio>
#include <cmath>
double a[] = { 1, 12.25, 22.67867897 };
char buf[256];
int main()
{
  for (double x : a)
  {
    for (char *p=buf+sprintf(buf, "%.250f", fmod(x, 1)); *--p=='0'; *p=0);
    if (!buf[2]) buf[2]='0';
    printf("%s\n", buf+2);
  }
  return 0;
}
READ ALSO
Не работает codeblocks на linux ubuntu

Не работает codeblocks на linux ubuntu

Я только недавно решил установить себе впервые линуксПроблема в следующем, при сборке выдает вот это :

183
Параметризовать компаратор

Параметризовать компаратор

Вот такую задачку "нарезали", не знаю с какой стороны подойтиМожет кто поможет

206