Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Округление числа


Автор: Samotnik 27.5.2007, 18:27
Добрый день!
Любопытно узнать как можно округлить double число.

Тока варианты типа
Код

double x;
int a;
a = (int)x;

непредлагать т.к. это просто отсечение, а не округление!!!!!!!!
 smile 

Автор: Earnest 27.5.2007, 18:55
int a =  (int) (x > 0 ? x + 0.5 : x - 0.5);

Автор: DigitSphinx 27.5.2007, 19:01
Стандартных функций не знаю но первое что приходит в голову это написать функцию самому !
Перевести double в строку , если надо округлить до i-го знака берем (i + 1)-ый знак если он больше 5-ти то i-ый знак ++ , отскаем все после i-го знака , переводим опять в double и возвращаем юзверу )) smile 
P.S. на C++ писать легче чем на кириллице !  smile 

Цитата

int a =  (int) (x > 0 ? x + 0.5 : x - 0.5);

 smile 
и что получится ?

Автор: nickless 27.5.2007, 19:05
Цитата(Samotnik @  27.5.2007,  17:27 Найти цитируемый пост)
округлить double число

Код

#include <cmath> (или math.h)
...
int bla = (int)round(7.78789);

?

Автор: Samotnik 27.5.2007, 19:18
2 Earnet

Цитата(Earnest @  27.5.2007,  18:55 Найти цитируемый пост)
int a =  (int) (x > 0 ? x + 0.5 : x - 0.5); 

эээээээ......       
и какое отношение это имеет к округлению числа??????


Автор: Earnest 27.5.2007, 19:20
Цитата(DigitSphinx @  27.5.2007,  20:01 Найти цитируемый пост)
и что получится ?

Стандартное округление: 3.67 округлиться до 4, а 3.45 - до 3.

nickless, нет в стандарте функции round

Автор: Samotnik 27.5.2007, 19:21
2 nickless 
на round   ругается типа  
Error C2065: 'round' : undeclared identifier
 smile 

Автор: DigitSphinx 27.5.2007, 19:24
Samotnik Тебе нужен результат типа int  или именно округление double’a до какой-то точности ?

Автор: Samotnik 27.5.2007, 19:27
2 DigitSphinx 
Округление double   !!!!! int  не причем!!!

Автор: Earnest 27.5.2007, 19:39
Samotnik, чего орать-то smile 
Учись вопросы задавать нормально. Под "просто" округлением обычно понимают именно округление до int.
Округление double до заданной точности можно сделать так:
Код

double Round (double v,double GRID)
{
   return floor(v / GRID + 0.5) * GRID;
}

Где GRID - требуемая точность, скажем, 0.001.

Автор: Samotnik 27.5.2007, 19:53
2 Earnest
Цитата(Earnest @  27.5.2007,  19:39 Найти цитируемый пост)
чего орать-то 

Я вообще-то  не ору !!!!!  Я вполне спокоен слушаю  LedZeppelin Stairway To Heaven
Вод!   smile  smile 


Цитата(Earnest @  27.5.2007,  19:39 Найти цитируемый пост)
Учись вопросы задавать нормально

Я умею вопросы задовать!!!!  вопрос типа


Цитата(Samotnik @  27.5.2007,  18:27 Найти цитируемый пост)
Любопытно узнать как можно округлить double число

ИМХО вполне вменяемый и понятный.

Проще только вот так-вот можно:
Как из числа 3.99999   получить 4,  из 12. 3  получить 12  !!!
Так понятнее?

Автор: Romikgy 27.5.2007, 20:20
имхо 
для этого
Цитата(Samotnik @  27.5.2007,  18:53 Найти цитируемый пост)
Как из числа 3.99999   получить 4,  из 12. 3  получить 12  !!!

подойдет и это
Цитата(Earnest @  27.5.2007,  17:55 Найти цитируемый пост)
int a =  (int) (x > 0 ? x + 0.5 : x - 0.5); 


Автор: Любитель 27.5.2007, 21:12
Цитата(Romikgy @  27.5.2007,  20:20 Найти цитируемый пост)
подойдет и это

Причём лучше всего smile

Автор: Earnest 28.5.2007, 07:16
Romikgy, сейчас Samotnik опять спросит "при чем тут int!"
Это жара, наверное ...  smile  

Автор: codelord 28.5.2007, 08:18
может поможет, функция (,,) и пример ее использования
Код

#include <iostream>
#include <math.h>
using namespace std;
double round( double val, int dem  ) {   // 4.99 49.9
 val *= pow( 10, dem );
 val = floor( val + 0.5 );
 val /= pow( 10, dem );
 return val;
}
 int main( int argc, char **argv )
{
 double m = 4.9856;
 cout << round( m, 0 ) << endl;    //4.9856 5.0
 cout << round( m, 2 ) << endl;    //4.9856 4.99
 cout << round( m, 3 ) << endl;    //4.9856 4.986
 m = 123.99992234532;
 cout << round( m, 2 ) << endl; // 123.99992234532 124.00;
 m = 123.099992234532;
 cout << round( m, 2 ) << endl; // 123.099992234532 123.1;
 return 0; 
}

Автор: 88andrey 28.5.2007, 08:52
Цитата

int a =  (int) (x > 0 ? x + 0.5 : x - 0.5); 


а если число до точки будет больше int'a то это не пройдет

Автор: Samotnik 28.5.2007, 23:30
Не ну я все понимаю, но не могу понять вот этого , обьясните плз кто шарит  

Цитата(88andrey @  28.5.2007,  08:52 Найти цитируемый пост)
int a =  (int) (x > 0 ? x + 0.5 : x - 0.5); 

Значит как я понимаю:
(int) - это преобразование  ,  затем
если  x>0  то   x + 0.5   иначе   x - 0.5
Ну это все при том что    х   double.     и че?   smile 
       расскажите плз  как ето работает!!

Автор: zkv 29.5.2007, 15:03
Цитата(Samotnik @  28.5.2007,  23:30 Найти цитируемый пост)
, но не могу понять вот этого , обьясните плз 


Цитата(Samotnik @  28.5.2007,  23:30 Найти цитируемый пост)
int a =  (int) (x > 0 ? x + 0.5 : x - 0.5); 

сначала вычисляется выражение в скобках: x > 0 ? x + 0.5 : x - 0.5. Эта конструкция (тернарный оператор) дает x + 0.5, если x > 0, и x - 0.5 во всех остальных случаях.
Далее результат преобразовывается к int. Все.

Цитата(88andrey @  28.5.2007,  08:52 Найти цитируемый пост)
а если число до точки будет больше int'a то это не пройдет 

поясните, пожалуйста.

Автор: JackYF 29.5.2007, 16:46
zkv, возможно, имеется ввиду округление числа типа 1234.56 * 10^58 до 10^59?

Автор: zkv 29.5.2007, 17:01
Цитата(JackYF @  29.5.2007,  16:46 Найти цитируемый пост)
возможно, имеется ввиду округление числа типа 1234.56 * 10^58 до 10^59

1234.56 * 10^58 == 1.23456 * 10^61,  округляем, получаем 10^59?  smile  smile 
я, вроде, понял, что ты имел ввиду. Я просто объяснил, что было записано в строке int a =  (int) (x > 0 ? x + 0.5 : x - 0.5);
А сказать наверняка, что имеется ввиду может только автор топика smile

Автор: JackYF 29.5.2007, 17:52
Цитата(zkv @  29.5.2007,  17:01 Найти цитируемый пост)
что имеется ввиду может только автор топика smile 

угу. Будем ждать.

Автор: sgrey 29.5.2007, 18:53
есть в с++ стандартные функции округления - floor - вниз и ceil - вверх. 
если double всегда будет в области int, то можно просто написать int a = x + 0.5. 
Если double в вычислениях может быть больше int, то можно сделать x - floor(x), и получить остаток. А там смотреть - больше 0,5 или меньше 0,5 и округлять в нужную сторону.

и ещё как codelord написал можно.. только я round функцию не видел в с++....

Автор: JackYF 29.5.2007, 19:57
Цитата(sgrey @  29.5.2007,  18:53 Найти цитируемый пост)
только я round функцию не видел в с++.... 


Где-то давно я ее видел... Но мне могло показаться. Или она не-ANSI была.

Автор: Romikgy 30.5.2007, 11:15
Цитата(88andrey @  28.5.2007,  07:52 Найти цитируемый пост)
а если число до точки будет больше int'a то это не пройдет 

юзать тогда int64  smile 

Автор: sgrey 31.5.2007, 22:28
Цитата(JackYF @ 29.5.2007,  19:57)
Цитата(sgrey @  29.5.2007,  18:53 Найти цитируемый пост)
только я round функцию не видел в с++.... 


Где-то давно я ее видел... Но мне могло показаться. Или она не-ANSI была.

ну я не отрицаю что её нет... надо порытся в справочниках будет по функциям... 

Автор: Любитель 2.6.2007, 12:33
Цитата(JackYF @  29.5.2007,  19:57 Найти цитируемый пост)
Или она не-ANSI была.

Угу. Многие производители компилеров добавляют в стандартную библиотеку. Но сие не есть стандарт.

Автор: Samotnik 5.6.2007, 00:43
Цитата(zkv @  29.5.2007,  17:01 Найти цитируемый пост)
А сказать наверняка, что имеется ввиду может только автор топика

Да без проблем  smile :
Нуна 2,368787945646987897564654798     округлить до 2
и ф-ция, кот вы мне порекомендовали не работает(к сожалению).

Пэ.Эс.
Да и ланно, закрываю тему, уж по-другому давно сделал!!!!!!!    Всем спасибо!!!!!!     smile 

Автор: zkv 5.6.2007, 03:55
Цитата(Samotnik @  5.6.2007,  00:43 Найти цитируемый пост)
Нуна 2,368787945646987897564654798     округлить до 2

и вы утверждаете, что в результате работы такой программы, у вас не 2 выводится?  smile 
Код

#include <iostream>

int MyRound( double x )
{
    return  (int) (x > 0 ? x + 0.5 : x - 0.5);
}

int main()
{
    std::cout<<MyRound( 2.368787945646987897564654798 );
    std::cin.get();
}

Цитата(Samotnik @  5.6.2007,  00:43 Найти цитируемый пост)
кот вы мне порекомендовали не работает(к сожалению).

порекомендовал вообще то не я, но рекомендацию поддерживаю  smile 

Автор: Samotnik 5.6.2007, 10:53
Цитата(zkv @  5.6.2007,  03:55 Найти цитируемый пост)
и вы утверждаете, что в результате работы такой программы, у вас не 2 выводится?

Не совсем так, просто я писал на  MFC курсач и там были большие вычисления (от начала до конца строки  smile ) Вот. И в итоге мне нуна было округлить double число до целого(т.к. нуно рассчитать количество машин) и эта формула не подходила.
Просто я попроще вопрос решил задать, т.к. думал, что есть какая-нить стандартная ф-ция для округления, но ее не оказалось.  smile    
А  простые вычисления(типа таких как вы написали) округляются без проблем  smile  

Автор: Дмитрий Т 11.7.2007, 12:29
Цитата(JackYF @ 29.5.2007,  20:57)
Цитата(sgrey @  29.5.2007,  18:53 Найти цитируемый пост)
только я round функцию не видел в с++.... 


Где-то давно я ее видел... Но мне могло показаться. Или она не-ANSI была.

round появилась в языке Си в стандарте C99, а в С++ как известно входит только C89 так что этой функции в C++ пока нет.

Автор: s_a_s_h_a 31.5.2011, 17:08
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)