Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2018, 09:50   #1
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
Вопрос Работа с перемменными типа double и float

Доброе утро всем форумчанам (и не форумчанам, короче, всем на свете)! :D Пытался сделать программу, которая считает кол-во чисел после запятой и выводит само число, расположенное после запятой. Проблема в том, что моя программа... как-то неправильно делает эти вещи: например, вводя число 10.1 программа выводит информацию о том, что чисел после запятой 2, а не 1, а результативное число равно почему-то 10, а не 1, хотя в случае 15.6 выводится всё правильно. Вводя 1.1 или 2.6 вывод идёт правильно, но когда вводится число с тремя числами после запятой (например, 1.456), программа выводит одно число после запятой, а само число - 4.56. Такие пироги

P.S.: Си-Аут в циклах я делал для того, что-бы знать, что происходит в циклах и что выводится в результате.
P.P.S.: Я сам новичок, если что, ненадо критиковать меня за ошибки. И тапками в меня кидаться не надо

Кстати, вот сам код:
Код:
#include<iostream>
#include<iomanip>
#include<math.h>
using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian");
	double nmb;
	cout << "Чему равно ваше число? \n \t Ввод: ";
	cin >> nmb;

	nmb = abs(nmb);

	nmb -= (int)nmb;

	if (nmb - (int)nmb == 0)
	{
		cout << nmb << endl;
		system("pause");
		return 0;
	}
	
	int amount_of_after_point_numbers = 0;

	while ((int)nmb == 0 ||(int)nmb % 10 == 0)
	{
		nmb *= 10;
		amount_of_after_point_numbers++;
		cout << "Значение числа в цикле равно " << nmb << endl;
		cout << "Кол-во чисел после запятой равно (в цикле) " << amount_of_after_point_numbers << endl;
	}

	cout << "Результативное число: " << nmb << endl;
	cout << "Окончательное кол-во чисел после запятой равно " << amount_of_after_point_numbers << endl;

	system("pause");
	return 0;
}

Последний раз редактировалось Novy; 28.06.2018 в 09:51. Причина: Опечатка
Novy вне форума Ответить с цитированием
Старый 28.06.2018, 10:06   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Novy Посмотреть сообщение
Пытался сделать программу, которая считает кол-во чисел после запятой
Во-первых, не чисел, а цифр (почитайте, что такое цифры, а что такое числа и чем они отличаются).

а во-вторых, задача может иметь решение ТОЛЬКО если числа вводятся в строковом виде и в этой строке можно подсчитать количество цифр до запятой, после запятой.
Всё остальное упирается в машинное представление и погрешность представления чисел в форме с плавающей запятой.

ознакомьтесь с теорией.
Например, ОЧЕНЬ рекомендую Вам ознакомится со статьёй
Неочевидные особенности вещественных чисел (с) Григорьев Антон
или на хабре - Что нужно знать про арифметику с плавающей запятой
или статья : Алексей Михайличенко с королевства дельфи - Загадки округления



p.s. для получения дробной части есть специальные функции.
Грубо говоря, чтобы получить дробную часть, нужно отнять от числа его целую часть.

Последний раз редактировалось Serge_Bliznykov; 28.06.2018 в 10:09.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.06.2018, 13:48   #3
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
Счастье

Код:
#include <iostream>
#include <string>
using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian");
	string number;
	cout << "Чему равно ваше число? \n \t Ввод: ";
	cin >> number;
	char ch = ',';
	size_t found = number.find(ch);
        if (found == string::npos) return 0;
	int pos = ++found;
	int after_the_decimal = number.length() - pos;
	char* tmp = new char[after_the_decimal+1]{ 0 };
	for (int i = 0; number[pos] != '\0'; i++, pos++){
		tmp[i] += number[pos];
		tmp[i + 1] += '\0';
	}
	cout << "Результативное число: " << tmp << endl;
	cout << "Окончательное кол-во чисел после запятой равно " << after_the_decimal << endl;
	delete[]tmp;
	system("pause");
	return 0;
}

Последний раз редактировалось 2Lui; 28.06.2018 в 14:37. Причина: Поправил замечания p51x
2Lui вне форума Ответить с цитированием
Старый 28.06.2018, 13:55   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. А если разделитель точка?
2. Лучше сравнивать с npos, а не с -1.
3. Какой смысл вообще сравнивать с -1 после инкремента?
p51x вне форума Ответить с цитированием
Старый 28.06.2018, 14:33   #5
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. А если разделитель точка?
2. Лучше сравнивать с npos, а не с -1.
3. Какой смысл вообще сравнивать с -1 после инкремента?
1.а если разделитель звёздочка? (ну тогда пускай, кто хочет тот и пишет для себя), тут чётко написано:
Цитата:
которая считает кол-во чисел после запятой
2.Ну тут вы правы, но можно и -1)
3.Ошибку исправил.
2Lui вне форума Ответить с цитированием
Старый 28.06.2018, 14:41   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от 2Lui Посмотреть сообщение
1.а если разделитель звёздочка?
А если Ы? Давайте не выдумывать, есть понятие десятичный разделитель. Он легко определяется по локали или системно.

Цитата:
Сообщение от 2Lui Посмотреть сообщение
2.Ну тут вы правы, но можно и -1)
Можно, до того как npos вдруг решат сделать другой константой. И тогда придется все проги переписывать. +сравнение с npos явно указывает, что проверяется.
p51x вне форума Ответить с цитированием
Старый 28.06.2018, 14:55   #7
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Код:
Давайте не выдумывать, есть понятие десятичный разделитель. Он легко определяется по локали или системно.
Ну я noob объясните как это сделать?Код покажите, быстрей пойму .

Последний раз редактировалось 2Lui; 28.06.2018 в 15:03. Причина: p51x
2Lui вне форума Ответить с цитированием
Старый 28.06.2018, 15:01   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну да, студень весь семестр прогулял. Закинул на форум сфотканные задачи - пусть лохи быстренько "напишут правильный код, покажут что да как, да еще построчно прокомментируют". А он пошел по очень важным делам... пиво нагревается... Так?
p51x вне форума Ответить с цитированием
Старый 28.06.2018, 15:24   #9
Novy
Пользователь
 
Регистрация: 28.06.2018
Сообщений: 38
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Грубо говоря, чтобы получить дробную часть, нужно отнять от числа его целую часть.
Во-первых, без капслока можно было донести свою мысль, товарищ модератор, во-вторых, я это как-бы и провернул, я не настолько туп, что-бы делать нахождение чисел после запятой без дробной части, я до этого додумался, в третьих, я не просил писать ваши программы, я просил подправить мою, если что-то не так, в четвёртых, поймите: я не знаю таких вещей, как какие-то ныпосы (чем бы они не были). И вообще, причём тут ссылка на сайт языка Дэльфи, где нет той инфы, которую я ищу? Логика?! Максимально упрощённых объяснений, товарищи, просим... А со строкой я работать не умею.. (если бы умел - я бы не спрашивал про то, как сделать свою задачу) Если кого-то обидел (если уж так вышло) - извиняюсь, но мне нужна помощь. При этом понятная. Ничего особого не требую с вас, я надеюсь
Novy вне форума Ответить с цитированием
Старый 28.06.2018, 15:56   #10
2Lui
Пользователь
 
Аватар для 2Lui
 
Регистрация: 14.03.2017
Сообщений: 68
По умолчанию

Ну на самом деле силка на сайт делфи там все есть то что вы ищете просто нужно читать а не листать.
Силку на хабр почитайте поймёте может быть.

Последний раз редактировалось 2Lui; 28.06.2018 в 16:19.
2Lui вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конвертация single float в double float kypck Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 23.04.2012 00:22
Float и Double crawter C# (си шарп) 1 19.03.2012 15:46
Ошибка типа cannot convert `float*' to `float' for argument `1' ... Trackman Помощь студентам 3 23.05.2011 17:09
Отображение значений переменных типа float и double(Языки Pascal и C) Сырно Помощь студентам 3 17.10.2010 18:37
float или double? zgest Общие вопросы C/C++ 10 20.03.2010 15:14