Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/113: Рейтинг темы: голосов - 113, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24

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

06.11.2011, 21:17. Показов 22642. Ответов 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;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2011, 21:17
Ответы с готовыми решениями:

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

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

Как округлить вещественное число
Здравствуйте! Использую Delphi 6. Имеется переменная var k: single = 0.96834456754; Мне нужно чтобы переменная также...

26
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
06.11.2011, 21:21
Цитата Сообщение от Count Посмотреть сообщение
любое вещественное число
Я не вижу в коде вещественных чисел.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 21:25
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;
}
2
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 21:37  [ТС]
Цитата Сообщение от 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 и все. И если честно почти не чего не понял что написано, и не думаю что преподаватель поверит что я сам все это изучил каким то не ведомым способом
0
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538
06.11.2011, 21:50
Ну если это и есть та функция то еще ничего не готово:
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;
}
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
06.11.2011, 21:57
hepr, твоя функция не округляет, а отбрасывает значение за нужным знаком
те на 123.234988 будет 123.234, а не 123.235
0
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 22:03  [ТС]
Цитата Сообщение от 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 минуты
Извиняюсь если уже поднадоел...
Вот то что успели сделать, и чем заканчиваются знания про функции:
Code
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
33
34
35
36
37
38
39
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);
    }
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
# include <locale>
#include <Windows.h>
using namespace std;
void Fruit()
{
    cout<<"Hello!!!\n";
    return;
}
void main ()
{
    Fruit();
    Fruit();
}
0
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538
06.11.2011, 22:23
Да, про само округление я и забыл))
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, а не самопальную
2
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
06.11.2011, 22:46  [ТС]
А что такое system("pause"); и "/="
И еще один вопросец... Как именно пользоваться программой? После ввода любого числа выводи это же число...
0
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538
06.11.2011, 23:54
system("pause") = системная функция, которая тупо ждет сигнал для продолжения
"/=" a/=2 это то же что и a = a/2
Попробуйте ввести например 1.12389 и увидите что выводит 1.124, как и должно
round(число которое надо округлить,сколько чисел надо округлить);
Если вы введете число типа 1.1 то и выведет 1.1, тк по-умолчанию я поставил количество чисел после запятой 3, то есть и выводит фактически: 1.100
1
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 24
07.11.2011, 08:29  [ТС]
Огромное спасибо!
0
2 / 2 / 1
Регистрация: 22.01.2015
Сообщений: 17
19.03.2015, 10:56
а если число округления должен ввести пользователь, как подправить код? Например число вводимое пользователем имеет после запятой энное кол-во знаков, а округлить нужно до числа, кот. опять вводит пользователем, каждый раз новое.
0
2 / 2 / 1
Регистрация: 22.01.2015
Сообщений: 17
21.03.2015, 17:35
Округление происходит до трёх знаков после запятой. А если нужно до 7го или другого знака.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
21.03.2015, 18:06
Цитата Сообщение от Alesandro07 Посмотреть сообщение
А если нужно до 7го или другого знака.
Цитата Сообщение от hepr Посмотреть сообщение
C++
1
d = round(d,3);
C++
1
d = round(d,7);
0
2 / 2 / 1
Регистрация: 22.01.2015
Сообщений: 17
21.03.2015, 18:06
Народ, посмотрите мой код по этой теме. Не могу понять где ошибка. Криво работает. Если ввести число например с 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);//вызов функции и показ результата
}
Подправьте пожалуйста код или прокомментируйте где и в чём ошибка.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.03.2015, 18:12
Цитата Сообщение от Count Посмотреть сообщение
Вот что уже готово, можете подсказать в чем ошибка и как исправить?
В том, что
Цитата Сообщение от Count Посмотреть сообщение
вещественное число
твоя функция даже принять не способна.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
24.03.2015, 19:44
Предлагаю целую и дробную части хранить отдельно в целых числах.
Иначе будут возникать проблемы типа
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";
}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
24.03.2015, 19:49
zss, что то Ваша проблема не понятна.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
24.03.2015, 20:14
Цитата Сообщение от taras atavin Посмотреть сообщение
что то Ваша проблема не понятна
Переменные типа double Нельзя точно перевести в десятичное представление,
всегда возможна ошибка в последней цифре.
В результате могут получаться результаты типа
1.239999999999999999999
1.240000000000000000000
1.240000000000000000001
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
25.03.2015, 09:06
Цитата Сообщение от zss Посмотреть сообщение
В результате могут получаться результаты типа
1.239999999999999999999
1.240000000000000000000
1.240000000000000000001
В результате чего? Округления до десятых? Бред. Округления до 21-й цифры после запятой? Ну вот такое оно в этой точности получилось, а все погрешности данной цифры следует отнести к процессу вычисления самого числа. 10 делится на 2 на цело без остатка, поэтому всякая конечная двоичная дробь имеет точное десятичное представление, но не наоборот. В противоположность этому ни одна троичная дробь не имеет точного десятичного представления и на наоборот.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.03.2015, 09:06
Помогаю со студенческими работами здесь

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

Округлить к ближайшему целому заданное вещественное число
Округлить к ближайшему целому заданное вещественное число. БЕЗ round

Округлить к ближайшему целому заданное вещественное число
Округлить к ближайшему целому заданное вещественное число. Округление к ближайшему целому (англ. round) — наиболее часто используемое...

Округлить к ближайшему целому заданное вещественное число
Округлить к ближайшему целому заданное вещественное число.

Округлить к ближайшему целому заданное вещественное число
Округлить к ближайшему целому заданное вещественное число. Округление к ближайшему целому (англ. round) — наиболее часто используемое...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru