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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 228, средняя оценка - 4.85
nchameleon
2 / 2 / 1
Регистрация: 06.04.2010
Сообщений: 161
#1

double округление с точность до N знаков - C++

13.10.2011, 08:46. Просмотров 32533. Ответов 15
Метки нет (Все метки)

Добрый день, помогите пожалуста
какую надо использовать функцию чтобы была возможность округлить значение числа double с точностью до N знаков,
при расчетах заранее не известно необходимая точность, а только в момент округления

я знаю только метод (double x *1000 /1000) но здесь уже задается изначальная точность округления в 3 знака
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 08:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос double округление с точность до N знаков (C++):

Double сокращение с точность до N знаков - C/C++ - C++
Хочу написать программу сокращающую число знаков после запятой на какое-то определённое количество заданное с клавиатуры (n). Пробовал...

Точность в N знаков после запятой числа типа double - C++
Добрый день, уважаемы форумчане! Возникла проблема, заключающаяся в изменении значения, получающегося в результате выполнения функции...

Точность в double - C++
Добрый день Мне задали сделать проект в универе - Калькулятор с великой точностю. Я уже почти его сделал, но у меня возникла...

Точность.Тип double - C++
Вопрос такой. Пишу программу, в которой имеется цикл: double t=0, dt = 0.000001; t = t + dt; cout << "t --> " << t << endl...

Точность вычислений у double - C++
Дана задача: "Определить, на сколько нулей заканчивается факториал числа n". Пример: вводим "25", на выходе должны получить "6" (25! =...

Точность типа double - C++
Всем привет! У меня такой код,точность как видите страдает,так как мне нужно с точностью до 20 знака #include<iostream> ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:07 #2
Цитата Сообщение от nchameleon Посмотреть сообщение
Добрый день, помогите пожалуста
какую надо использовать функцию чтобы была возможность округлить значение числа double с точностью до N знаков,
при расчетах заранее не известно необходимая точность, а только в момент округления
Вариант 1 Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h>
#include <conio.h>
 
int main()
{
    double val = 0, div = 0;
    long pers;
    char fmt[32];
    do
    {
        printf("Enter VALUE     : ");scanf("%lf",&val);
        printf("Enter DIVIDER   : "); scanf("%lf",&div);
        printf("Enter PERSIGION : ");scanf("%u",&pers);
        sprintf(fmt,"%%.\n",pers);//Формируем строку формата
        //pers - задаст число знаков после запятой
        printf("VAL/DIV : ");
        printf(fmt,val/div);
        printf("Press \'y\' for new input\n");
    }
    while(getch() == 'y');
    return 0;
}
0
Миниатюры
double округление с точность до N знаков  
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 11:16 #3
Если нужно именно выводить числа с указанным числом знаков после запятой, то в С++ можно сделать так, как в примере

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    double x=15212/3917.0;
    cout<<x<<endl;
 
    cout<<fixed<<setprecision(1)<<x<<endl;
    cout<<fixed<<setprecision(2)<<x<<endl;
    cout<<fixed<<setprecision(3)<<x<<endl;
    cout<<fixed<<setprecision(4)<<x<<endl;
 
    int N;
    cout<<"\nN=";
    cin>>N;
    cout<<fixed<<setprecision(N)<<x<<endl;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:21 #4
Вариант 2 С++ (можно и в Си) - Отделение целой и дробной части числа
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <cmath>
 
int main()
{
    double val = 0, div = 0;
    double ipart1, ipart2, fpart;
    long pers;
    do
    {
        std::cout<<"Enter VALUE     : ";std::cin>>val;
        std::cout<<"Enter DIVIDER   : ";std::cin>>div;
        std::cout<<"Enter PERSIGION : ";std::cin>>pers;
        //Разбиваем число на целую и дробную чати
        fpart = modf(val/div,&ipart1);
        //дробную умножаем на 10^pers чтобы потом снова разбить
        fpart = modf(fpart*pow(10,pers),&ipart2);
        ipart1 += ipart2/pow(10,pers);
        std::cout<<"VAL/DIV : "<<ipart1<<"\n";
        printf("Press \'y\' for new input\n");
    }
    while(getch() == 'y');
    return 0;
}
0
Изображения
 
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:22 #5
nchameleon, для разбиения использовал функцию
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
modf
, подробней о ней здесь http://www.cplusplus.com/reference/clibrary/cmath/modf/

PS:Последним вариантом у меня было самое простое - использование манипуляторов, но aeshes, привела данный вариант раньше поэтому свой вариант опущу
(отмечу однако что для Си манипуляторов нет и область данного метода ограничивается лишь С++)
0
Байт
Эксперт C
16062 / 10331 / 1540
Регистрация: 24.12.2010
Сообщений: 19,463
13.10.2011, 11:41 #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
(отмечу однако что для Си манипуляторов нет и область данного метода ограничивается лишь С++)
C
1
printf("%.*f", prec, x);
2
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 12:02 #7
Байт, что ты этим хотел сказать?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sprintf(fmt,"%%.\n",pers);//Формируем строку формата
* * * * * * * * //pers - задаст число знаков после запятой
* * * * * * * * printf("VAL/DIV : ");
* * * * * * * * printf(fmt,val/div);
- это видел?Я формирую строку формата, которую ты здесь привёл
Цитата Сообщение от Байт Посмотреть сообщение
"%.*f"
, будь внимательней
1
nchameleon
2 / 2 / 1
Регистрация: 06.04.2010
Сообщений: 161
13.10.2011, 12:02  [ТС] #8
спасибо за ответы, это тоже мне очень пригодиться,
но сейчас нужно округлить число для дальнейшие работы программы,
т.е. получилось число double x = 12.15481456, его надо преобразовать к точности N=5 и получить y=12.15482
а дальше уже с этим чилом я буду проводить обработку

нужна функция типа y = round(x,N);
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
13.10.2011, 12:11 #9
Из книги Дейтелов:
Функция floor может использоваться для округления значения до
определенного числа знаков дробной части. Оператор
у = floor( х * 10 + .5 ) / 10;
округляет х с точностью до одной десятой (первая позиция справа от десятичной
точки). Оператор
у = floor( х * 100 + .5 )/ 100;
округляет х с точностью до одной сотой (вторая позиция справа от десятичной
точки).


Функция floor находится в библиотеке cmath.
1
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
13.10.2011, 12:20 #10
C++
1
2
3
4
5
6
7
8
9
10
11
double round (double x, int precision)
{
   int mul = 10;
   
   for (int i = 0; i < precision; i++)
      mul *= mul;
   if (x > 0)
      return floor(x * mul + .5) / mul;
   else
      return ceil(x * mul - .5) / mul;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 12:31 #11
C++
1
2
3
4
    int mul = 1;
 
    for (int i = 0; i < precision; i++)
        mul *= 10;
1
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 13:04 #12
Deviaphan, задание прочёл
Цитата Сообщение от nchameleon Посмотреть сообщение
какую надо использовать функцию чтобы была возможность округлить значение числа double с точностью до N знаков
- особенно обрати внимание на тип N
Умножение на 10 уже выполнено
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//дробную умножаем на 10^pers чтобы потом снова разбить
pow(10,pers)
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 13:13 #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
задание прочёл
Я отвечал на пост с вот этим:
C++
1
2
3
4
5
6
7
8
9
10
11
double round (double x, int precision)
{
   int mul = 10;
   
   for (int i = 0; i < precision; i++)
      mul *= mul;
   if (x > 0)
      return floor(x * mul + .5) / mul;
   else
      return ceil(x * mul - .5) / mul;
}
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Умножение на 10 уже выполнено
Я решил лишний раз тебя не травмировать и не стал комментировать столь извращённые способы округления, которые ты привёл. Могу прокомментировать.
1
-=ЮрА=-
13.10.2011, 13:52
  #14

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
столь извращённые способы округления
- о каких извращениях ведёшь речь?Моей целью было показать 3 способа округления, форматом вывода, разбиением числа на целую и дробную части и вывод с манипулятором (тут меня опередили и я не стал приводить уже выложенное). Что же касается твоего кода - на мой взгляд это как раз ненужный код хочешь коментируй хочешь нет
Цитата Сообщение от Deviaphan Посмотреть сообщение
Могу прокомментировать.
Больше не хочу с тобой вобще общаться, на твои пост внимания ноль, жаль что администрация закрывает глаза на твоё отношение к участникам форума!

0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 13:58 #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
3 способа округления, форматом вывода, разбиением числа на целую и дробную части и вывод с манипулятором (тут меня опередили и я не стал приводить уже выложенное). Что же касается твоего кода - на мой взгляд это как раз ненужный код
Первый и третий - не округление, а форматирование при выводе на экран. Через разделение на целую и дробную часть - изврат.
Вариант, в котором я исправил ошибку - наиболее простой и эффективный. Переубеждать тебя не буду, используй разделение на целую и дробную часть, мне не жалко.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
отношение к участникам форума
Да я вообще негодяй, смею на ошибки указывать... Отшлёпать меня за это.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 13:58
Привет! Вот еще темы с ответами:

точность возвращения функции long double - C++
есть число a long double надо написать чтобы фунция возвращала число до 25 знака после запятой то есть return a.%25; (как...

Теряется точность при вычислении с double - C++
Доброго времени суток. В процессе решения кубического уравнения, у меня теряется точность переменной типа double. Пробовал использовать...

Округление double - C++
Короче ввожу число 1.05 в Debug показывает его, как 1.004999999999999999995663191310058 вот как эту чушь убрать, у меня задача из-за...

Округление Double - C++
Использую Double, возникают при тонких расчетах проблемы с округлением. Какие есть стандартные способы решения? :)


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

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

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