#cpp #double
Примерно продумал синтаксис, но выводит число неправильно. Алгоритм такой: число оставить без его целой части, далее умножать на 10 до тех пор, пока разность nmb - (int)nmb не окажется равной нулю. #include#include 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) Скажет, есть ли что-то проще ваших Сишных функций: поймите, я новичок.
Ответы
Ответ 1
Скажите, а int nmb, frc; char dot; cin >> nmb >> dot >> frc; вас не устроит? После этого то, что вам нужно - будет в frc... Проблема одна - что вы хотите получить для 14.0025 - тоже 25?Ответ 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Ответ 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;Ответ 4
https://ideone.com/Re3Wjx #include#include 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; }
Комментариев нет:
Отправить комментарий