2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176
1

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

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

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

я знаю только метод (double x *1000 /1000) но здесь уже задается изначальная точность округления в 3 знака
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2011, 08:46
Ответы с готовыми решениями:

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

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

Округление double до 2-х знаков
Добрый день! я в отчаянии. как мне округлить double до 2-х точек? я пробовала round(n*100)/100.0,...

Visual Basic 2013 сложение чисел, округление до 2 знаков после запятой, отбрасывание знаков
Как сложить несколько чисел из TextBox, округлить их, отбросить знаки после запятой? показать...

15
Заблокирован
Автор 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;
}
Миниатюры
double округление с точность до N знаков  
0
446 / 209 / 21
Регистрация: 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;
}
1
Заблокирован
Автор 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/refer... math/modf/

PS:Последним вариантом у меня было самое простое - использование манипуляторов, но aeshes, привела данный вариант раньше поэтому свой вариант опущу
(отмечу однако что для Си манипуляторов нет и область данного метода ограничивается лишь С++)
0
Диссидент
Эксперт C
26839 / 16746 / 3670
Регистрация: 24.12.2010
Сообщений: 37,492
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
2 / 2 / 5
Регистрация: 06.04.2010
Сообщений: 176
13.10.2011, 12:02  [ТС] 8
спасибо за ответы, это тоже мне очень пригодиться,
но сейчас нужно округлить число для дальнейшие работы программы,
т.е. получилось число double x = 12.15481456, его надо преобразовать к точности N=5 и получить y=12.15482
а дальше уже с этим чилом я буду проводить обработку

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


Функция floor находится в библиотеке cmath.
1
3087 / 2408 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
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
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1312 / 1227 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
13.10.2011, 13:58 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
3 способа округления, форматом вывода, разбиением числа на целую и дробную части и вывод с манипулятором (тут меня опередили и я не стал приводить уже выложенное). Что же касается твоего кода - на мой взгляд это как раз ненужный код
Первый и третий - не округление, а форматирование при выводе на экран. Через разделение на целую и дробную часть - изврат.
Вариант, в котором я исправил ошибку - наиболее простой и эффективный. Переубеждать тебя не буду, используй разделение на целую и дробную часть, мне не жалко.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
отношение к участникам форума
Да я вообще негодяй, смею на ошибки указывать... Отшлёпать меня за это.
0
16087 / 8687 / 2122
Регистрация: 30.01.2014
Сообщений: 14,975
30.01.2014, 11:37 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;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2014, 11:37
Помогаю со студенческими работами здесь

Количество знаков после запятой double, Long double
Есть число большой точности A. A=-1.768573656315270993281 742915329544712934120053405549882...

Точность double
Возник вопрос: если перемножить числа типов double и обрезать знаки после точки с помощью f2...

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

точность double
Всем доброго времени суток! Недавно начал изучать С#, при решении простой задачи: найти сумму...

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

Точность вычислений у double
Дана задача: &quot;Определить, на сколько нулей заканчивается факториал числа n&quot;. Пример: вводим &quot;25&quot;,...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru