Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.75
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
#1

Округлить любое вещественное число до определённого количества знаков с математической точностью - C++

06.11.2011, 21:17. Просмотров 8626. Ответов 26
Метки нет (Все метки)

Пишем Microsoft Visual Studio -> Win32 Console Application -> C++.
Нужно написать функцию, которая округляет любое вещественное число до определённого количества знаков с математической точностью.
Вот что уже готово, можете подсказать в чем ошибка и как исправить?
(Изучаю функцию одну пару, так что хочу попросить объяснять и показывать как можно проще и примитивнее Про ceil нам тоже еще не рассказывали, читал Дейтел, нашел решил попробовать...)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
# include <locale>
# include <Windows.h>
#include <cmath>
using namespace std;
void main ()
{
int z;
cout<<"Введите число\n";
    cin>>z;
    cout<<Fal(z);
}
int Fal ( int a)
{
    char q;
    q = ceil(a);
    return q;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2011, 21:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Округлить любое вещественное число до определённого количества знаков с математической точностью (C++):

Как округлить в С++ вещественное число до 2 знаков после запятой? - C++
Ну собсно вопрос в теме. заранее спасибо))

Функция, округляющая вещественные числа до определённого количества знаков - C++
Написать функцию, которая округляет любое вещественное число до определённого количества знаков с математической точностью.

Округлить число до 25 знаков после десятичной точки - C++
Есть простая задача: вот я ее решаю таким способом, т.к в задании написано округлить #include &lt;fstream&gt; #include &lt;string&gt;...

Дано вещественное число, проверить является ли это число симметричным относительно положения точки до двух знаков после запятой. - C++
Только начинаю программировать на с/с++ и столкнулась с логическими выражениями, простейшие задачи могу решить а в эту никак не могу...

Пользователь вводит с клавиатуры: начальную сумму, внесённую на депозит (вещественное положительное число), годовой процент (вещественное положительно - C++
Пользователь вводит с клавиатуры: начальную сумму, внесённую на депозит (вещественное положительное число), годовой процент (вещественное...

исправьте ошибку!округлить double до 2-х знаков после запятой - C++
округлять,не используя math.h #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; int main () { double i; printf (&quot;i=&quot;); scanf...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.11.2011, 21:21 #2
Цитата Сообщение от Count Посмотреть сообщение
любое вещественное число
Я не вижу в коде вещественных чисел.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 21:25 #3
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <math.h>
 
double round_value(double value, unsigned number_count)
{
   double base = pow (10., (int)number_count);
   return floor (value * base + 0.5) / base; 
}
 
int main()
{
   double value = 12.23434234234;
   printf("round (%f, 3) = %f\n", value, round_value(value, 3));
   return 0;
}
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 21:37  [ТС] #4
Цитата Сообщение от alex_x_x Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <math.h>
 
double round_value(double value, unsigned number_count)
{
   double base = pow (10., (int)number_count);
   return floor (value * base + 0.5) / base; 
}
 
int main()
{
   double value = 12.23434234234;
   printf("round (%f, 3) = %f\n", value, round_value(value, 3));
   return 0;
}
Возможно я что то не так делаю, но после запуска этого кода на экран выводится только 12.23434234234 и все. И если честно почти не чего не понял что написано, и не думаю что преподаватель поверит что я сам все это изучил каким то не ведомым способом
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
06.11.2011, 21:50 #5
Ну если это и есть та функция то еще ничего не готово:
C++
1
2
3
4
5
6
int Fal ( int a)
{
        char q;
        q = ceil(a);
        return q;
}
Вот мой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <string>
#include <iostream>
 
using namespace std;
double pow(double number, int degree)
{
    double newNumber = number;
    while(degree>1)
    {
        newNumber *= number;
        degree--;
    }
    return newNumber;
}
double round(double number,int n)
{
    double degree = pow(10,n);
    number *= degree;
    number = static_cast<int>(number);
    number /= degree;
 
    return number;
}
int main(int argc, char* argv[])
{
    double d;
    cin >> d;
    d = round(d,3);
    cout << d;
    system("pause");
    return 0;
}
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 21:57 #6
hepr, твоя функция не округляет, а отбрасывает значение за нужным знаком
те на 123.234988 будет 123.234, а не 123.235
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 22:03  [ТС] #7
Цитата Сообщение от hepr Посмотреть сообщение
Ну если это и есть та функция то еще ничего не готово:
C++
1
2
3
4
5
6
int Fal ( int a)
{
        char q;
        q = ceil(a);
        return q;
}
Вот мой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <string>
#include <iostream>
 
using namespace std;
double pow(double number, int degree)
{
    double newNumber = number;
    while(degree>1)
    {
        newNumber *= number;
        degree--;
    }
    return newNumber;
}
double round(double number,int n)
{
    double degree = pow(10,n);
    number *= degree;
    number = static_cast<int>(number);
    number /= degree;
 
    return number;
}
int main(int argc, char* argv[])
{
    double d;
    cin >> d;
    d = round(d,3);
    cout << d;
    system("pause");
    return 0;
}
Спасибо (Правда код что то не очень работает )
Хочу спросить что такое: double, pow, system("pause");, static_cast<int>(number);, degree--;(первое что бросилось в глаза...)

Добавлено через 4 минуты
Извиняюсь если уже поднадоел...
Вот то что успели сделать, и чем заканчиваются знания про функции:
Код
clude <iostream>
# include <locale>
#include <Windows.h>
using namespace std;
int Fal ( int a, int b, char g)
{
int h;
  switch (g)
  {
  case '+':
	  h=a+b; 
	  break;
 case '-':
	  h=a-b; 
	  break;
 case '*':
	  h=a*b; 
	  break;
   case '/':
	  h=a/b; 
	  break;
   case '%':
	  h=a%b; 
	  break;
  }
return h;
}
void main ()
{
int z, x;
char p;
	cout<<"Chislo1\n";
	cin>>x;
	cout<<"Chislo2\n";
	cin>>z;
	cout<<"Chto delaem\n";
	cin>>p;
	cout<<Fal(x,z,p);
	}
Код
#include <iostream>
# include <locale>
#include <Windows.h>
using namespace std;
void Fruit()
{
	cout<<"Hello!!!\n";
	return;
}
void main ()
{
	Fruit();
	Fruit();
}
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
06.11.2011, 22:23 #8
Да, про само округление я и забыл))
double, pow, system("pause");, static_cast<int>(number);, degree--
double - вещественный тип
pow() моя функция(она описана у в коде)
static_cast<int>(number) преобразует double в int(в данном случае, тк number - double)
degree -- это тоже самое что и degree = degree - 1;

Добавлено через 8 минут
Вот подправил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <string>
#include <iostream>
#include "math.h"
 
using namespace std;
 
double round(double number,int n)
{
    double degree = pow(10.0,n);
    number *= degree;
    double tail = number - static_cast<int>(number);
    if(tail>=0.5)
        tail = 1;
    else
        tail = 0;
    number = static_cast<int>(number+tail);
    number /= degree;
 
    return number;
}
int main(int argc, char* argv[])
{
    double d;
    cin >> d;
    d = round(d,3);
    cout << d;
    system("pause");
    return 0;
}
Добавлено через 37 секунд
* Теперь использую функцию pow() из math.h, а не самопальную
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 22:46  [ТС] #9
А что такое system("pause"); и "/="
И еще один вопросец... Как именно пользоваться программой? После ввода любого числа выводи это же число...
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
06.11.2011, 23:54 #10
system("pause") = системная функция, которая тупо ждет сигнал для продолжения
"/=" a/=2 это то же что и a = a/2
Попробуйте ввести например 1.12389 и увидите что выводит 1.124, как и должно
round(число которое надо округлить,сколько чисел надо округлить);
Если вы введете число типа 1.1 то и выведет 1.1, тк по-умолчанию я поставил количество чисел после запятой 3, то есть и выводит фактически: 1.100
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
07.11.2011, 08:29  [ТС] #11
Огромное спасибо!
Alesandro07
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 17
19.03.2015, 10:56 #12
а если число округления должен ввести пользователь, как подправить код? Например число вводимое пользователем имеет после запятой энное кол-во знаков, а округлить нужно до числа, кот. опять вводит пользователем, каждый раз новое.
Alesandro07
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 17
21.03.2015, 17:35 #13
Округление происходит до трёх знаков после запятой. А если нужно до 7го или другого знака.
Kerry_Jr
Модератор
Эксперт PHP
2184 / 1980 / 692
Регистрация: 14.05.2014
Сообщений: 5,788
Записей в блоге: 1
Завершенные тесты: 5
21.03.2015, 18:06 #14
Цитата Сообщение от Alesandro07 Посмотреть сообщение
А если нужно до 7го или другого знака.
Цитата Сообщение от hepr Посмотреть сообщение
C++
1
d = round(d,3);
C++
1
d = round(d,7);
Alesandro07
1 / 1 / 0
Регистрация: 22.01.2015
Сообщений: 17
21.03.2015, 18:06 #15
Народ, посмотрите мой код по этой теме. Не могу понять где ошибка. Криво работает. Если ввести число например с 15 знаками после запятой, а потом прописать цифру, которая оставит соответствующее кол-во знаков после запятой например 9... то что-то не так работает. Библиотеку #include <string> не подключать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <math.h>
using namespace std;
 
void okrugl(double a, int b)
{
    double celoe, drobi, st;
    int full;
    st=pow(10.0, b);
    celoe=a*st;
    full=(int)celoe;
    drobi=celoe-full;
    if(drobi>=0.5) // условие позволяющие корректно округлять при последней 5 и >
    {
        full=full+1;}
    celoe=full/st;
    cout<<celoe<<"\n";
}
void main()
{
    setlocale(LC_ALL,"Russian");
    double a, b;
    cout<<"Введите число с любым количеством знаков после запятой: "<<"\n";
    cin>>a;
    cout<<"Введите число равное порядковому номеру после запятой, которое должно остаться с учетом округления:"<<"\n";
    cin>>b;
 
    okrugl(a,b);//вызов функции и показ результата
}
Подправьте пожалуйста код или прокомментируйте где и в чём ошибка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2015, 18:06
Привет! Вот еще темы с ответами:

Вывод определённого кол-ва знаков после запятой в структуре! - C++
Ребята,передо мной была поставлена задача,которую я решил,но теперь вот у меня возник вопрос! вот прога по структурам,которую я написал: ...

Функция floor для округления значения до определённого числа знаков дробной части - C++
Всем привет ребята. кто мог бы объяснить где и что неправильно у меня в коде и как это исправить. Благодарю за внимание. Условие задачи:...

Округлить число до заданного количества знаков после запятой - Bash
Надо написать скрипт (Bash). В общем вот задача. На входе задано число с четырьмя знаками после запятой. Произвести его округление до...

Округлить вещественное число побитно - Assembler
Здравствуйте. Не силён в ассемблере, по этому прошу помощи у Вас. Использую делфи, есть переменная типа extendet. Мне нужно эмулировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.03.2015, 18:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru