Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

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

#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; }

Комментариев нет:

Отправить комментарий