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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 228, средняя оценка - 4.85
nchameleon
2 / 2 / 1
Регистрация: 06.04.2010
Сообщений: 161
13.10.2011, 08:46     double округление с точность до N знаков #1
Добрый день, помогите пожалуста
какую надо использовать функцию чтобы была возможность округлить значение числа double с точностью до N знаков,
при расчетах заранее не известно необходимая точность, а только в момент округления

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

C++ Точность.Тип double
Округление double C++
Точность типа double C++
точность возвращения функции long double C++
Почему точность Double такая же как у Float ? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:07     double округление с точность до N знаков #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;
}
Миниатюры
double округление с точность до N знаков  
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
13.10.2011, 11:16     double округление с точность до N знаков #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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:21     double округление с точность до N знаков #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;
}
Изображения
 
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 11:22     double округление с точность до N знаков #5
nchameleon, для разбиения использовал функцию
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
modf
, подробней о ней здесь http://www.cplusplus.com/reference/clibrary/cmath/modf/

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

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


Функция floor находится в библиотеке cmath.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.10.2011, 12:20     double округление с точность до N знаков #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;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 12:31     double округление с точность до N знаков #11
C++
1
2
3
4
    int mul = 1;
 
    for (int i = 0; i < precision; i++)
        mul *= 10;
-=ЮрА=-
Заблокирован
Автор FAQ
13.10.2011, 13:04     double округление с точность до N знаков #12
Deviaphan, задание прочёл
Цитата Сообщение от nchameleon Посмотреть сообщение
какую надо использовать функцию чтобы была возможность округлить значение числа double с точностью до N знаков
- особенно обрати внимание на тип N
Умножение на 10 уже выполнено
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//дробную умножаем на 10^pers чтобы потом снова разбить
pow(10,pers)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 13:13     double округление с точность до N знаков #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 уже выполнено
Я решил лишний раз тебя не травмировать и не стал комментировать столь извращённые способы округления, которые ты привёл. Могу прокомментировать.
-=ЮрА=-
13.10.2011, 13:52
  #14

Не по теме:

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

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

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

Точность в N знаков после запятой числа типа double C++
C++ Округление знаков, после точки
C++ Округление до определенного количества знаков

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

Или воспользуйтесь поиском по форуму:
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
30.01.2014, 11:37     double округление с точность до N знаков #16
Чтобы не считать множитель в райнтайме (если это не нужно):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// CT pow
template <long num, size_t n, size_t y = 1>
struct pow
{
    enum { value = pow<num * num, (n >> 1), n & 1 ? num * y : y>::value };
};
template <long num, size_t y>
struct pow<num, 0, y>
{
    enum { value = y };
};
// round
template <size_t Precision>
inline float round(float x)
{
    enum
    {
        PrecMul = pow<10, Precision>::value
    };
    const float rVal = x * PrecMul + 0.5;
    return (x > 0. ? floor(rVal) : ceil(rVal)) / PrecMul;
}
Yandex
Объявления
30.01.2014, 11:37     double округление с точность до N знаков
Ответ Создать тему
Опции темы

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