Примерно продумал синтаксис, но выводит число неправильно. Алгоритм такой: число оставить без его целой части, далее умножать на 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) Скажет, есть ли что-то проще ваших Сишных функций: поймите, я новичок.
Скажите, а
int nmb, frc;
char dot;
cin >> nmb >> dot >> frc;
вас не устроит? После этого то, что вам нужно - будет в frc
...
Проблема одна - что вы хотите получить для 14.0025
- тоже 25
?
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
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;
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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я только недавно решил установить себе впервые линуксПроблема в следующем, при сборке выдает вот это :
Вот такую задачку "нарезали", не знаю с какой стороны подойтиМожет кто поможет