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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.75
Count
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 21:17     Округлить любое вещественное число до определённого количества знаков с математической точностью #1
Пишем 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     Округлить любое вещественное число до определённого количества знаков с математической точностью
Посмотрите здесь:

Как округлить в С++ вещественное число до 2 знаков после запятой? C++
C++ Вывод определённого кол-ва знаков после запятой в структуре!
C++ Дано вещественное число, проверить является ли это число симметричным относительно положения точки до двух знаков после запятой.
C++ Пользователь вводит с клавиатуры: начальную сумму, внесённую на депозит (вещественное положительное число), годовой процент (вещественное положительно
C++ Округлить число до 25 знаков после десятичной точки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.11.2011, 21:21     Округлить любое вещественное число до определённого количества знаков с математической точностью #2
Цитата Сообщение от Count Посмотреть сообщение
любое вещественное число
Я не вижу в коде вещественных чисел.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
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
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
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
Модератор
 Аватар для Kerry_Jr
1857 / 1653 / 577
Регистрация: 14.05.2014
Сообщений: 4,746
Записей в блоге: 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);//вызов функции и показ результата
}
Подправьте пожалуйста код или прокомментируйте где и в чём ошибка.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.03.2015, 18:12     Округлить любое вещественное число до определённого количества знаков с математической точностью #16
Цитата Сообщение от Count Посмотреть сообщение
Вот что уже готово, можете подсказать в чем ошибка и как исправить?
В том, что
Цитата Сообщение от Count Посмотреть сообщение
вещественное число
твоя функция даже принять не способна.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
24.03.2015, 19:44     Округлить любое вещественное число до определённого количества знаков с математической точностью #17
Предлагаю целую и дробную части хранить отдельно в целых числах.
Иначе будут возникать проблемы типа
1.2349999999999999
C++
1
2
3
4
5
6
7
8
9
10
11
12
void okrugl(double a, int b)
{
    int celoe, drob;
    celoe=(int)a;
    a=fabs(a-celoe);
    for(int i=0;i<b;i++)
        a*=10;
    drob=(int)a;
    if(a-drob>0.5)
        drob++;
    cout<<celoe<<'.'<<drob<<"\n";
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.03.2015, 19:49     Округлить любое вещественное число до определённого количества знаков с математической точностью #18
zss, что то Ваша проблема не понятна.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
24.03.2015, 20:14     Округлить любое вещественное число до определённого количества знаков с математической точностью #19
Цитата Сообщение от taras atavin Посмотреть сообщение
что то Ваша проблема не понятна
Переменные типа double Нельзя точно перевести в десятичное представление,
всегда возможна ошибка в последней цифре.
В результате могут получаться результаты типа
1.239999999999999999999
1.240000000000000000000
1.240000000000000000001
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2015, 09:06     Округлить любое вещественное число до определённого количества знаков с математической точностью
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
25.03.2015, 09:06     Округлить любое вещественное число до определённого количества знаков с математической точностью #20
Цитата Сообщение от zss Посмотреть сообщение
В результате могут получаться результаты типа
1.239999999999999999999
1.240000000000000000000
1.240000000000000000001
В результате чего? Округления до десятых? Бред. Округления до 21-й цифры после запятой? Ну вот такое оно в этой точности получилось, а все погрешности данной цифры следует отнести к процессу вычисления самого числа. 10 делится на 2 на цело без остатка, поэтому всякая конечная двоичная дробь имеет точное десятичное представление, но не наоборот. В противоположность этому ни одна троичная дробь не имеет точного десятичного представления и на наоборот.
Yandex
Объявления
25.03.2015, 09:06     Округлить любое вещественное число до определённого количества знаков с математической точностью
Ответ Создать тему
Опции темы

Текущее время: 06:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru