Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Округление числа 
V
    Опции темы
Samotnik
Дата 27.5.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



Добрый день!
Любопытно узнать как можно округлить double число.

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

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

непредлагать т.к. это просто отсечение, а не округление!!!!!!!!
 smile 
PM MAIL   Вверх
Earnest
Дата 27.5.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
DigitSphinx
Дата 27.5.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Стандартных функций не знаю но первое что приходит в голову это написать функцию самому !
Перевести 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 
и что получится ?

Это сообщение отредактировал(а) DigitSphinx - 27.5.2007, 19:03


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
nickless
Дата 27.5.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



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

Код

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

?


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Samotnik
Дата 27.5.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



2 Earnet

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

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


PM MAIL   Вверх
Earnest
Дата 27.5.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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

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

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


--------------------
...
PM   Вверх
Samotnik
Дата 27.5.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



2 nickless 
на round   ругается типа  
Error C2065: 'round' : undeclared identifier
 smile 
PM MAIL   Вверх
DigitSphinx
Дата 27.5.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Samotnik Тебе нужен результат типа int  или именно округление double’a до какой-то точности ?


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Samotnik
Дата 27.5.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



2 DigitSphinx 
Округление double   !!!!! int  не причем!!!
PM MAIL   Вверх
Earnest
Дата 27.5.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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

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

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



--------------------
...
PM   Вверх
Samotnik
Дата 27.5.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



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  !!!
Так понятнее?
PM MAIL   Вверх
Romikgy
Дата 27.5.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



имхо 
для этого
Цитата(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); 




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Любитель
Дата 27.5.2007, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Romikgy @  27.5.2007,  20:20 Найти цитируемый пост)
подойдет и это

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


--------------------
PM MAIL ICQ Skype   Вверх
Earnest
Дата 28.5.2007, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
codelord
Дата 28.5.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



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

#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; 
}



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
88andrey
Дата 28.5.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Цитата

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


а если число до точки будет больше int'a то это не пройдет
PM MAIL   Вверх
Samotnik
Дата 28.5.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



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

Цитата(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 
       расскажите плз  как ето работает!!

PM MAIL   Вверх
zkv
Дата 29.5.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(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 то это не пройдет 

поясните, пожалуйста.
PM MAIL   Вверх
JackYF
Дата 29.5.2007, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zkv
Дата 29.5.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(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
PM MAIL   Вверх
JackYF
Дата 29.5.2007, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sgrey
Дата 29.5.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



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

и ещё как codelord написал можно.. только я round функцию не видел в с++....
PM MAIL   Вверх
JackYF
Дата 29.5.2007, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



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


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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Romikgy
Дата 30.5.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
sgrey
Дата 31.5.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



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


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

ну я не отрицаю что её нет... надо порытся в справочниках будет по функциям... 
PM MAIL   Вверх
Любитель
Дата 2.6.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(JackYF @  29.5.2007,  19:57 Найти цитируемый пост)
Или она не-ANSI была.

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


--------------------
PM MAIL ICQ Skype   Вверх
Samotnik
Дата 5.6.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



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

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

Пэ.Эс.
Да и ланно, закрываю тему, уж по-другому давно сделал!!!!!!!    Всем спасибо!!!!!!     smile 
PM MAIL   Вверх
zkv
Дата 5.6.2007, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(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 
PM MAIL   Вверх
Samotnik
Дата 5.6.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: нет
Всего: 191



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

Не совсем так, просто я писал на  MFC курсач и там были большие вычисления (от начала до конца строки  smile ) Вот. И в итоге мне нуна было округлить double число до целого(т.к. нуно рассчитать количество машин) и эта формула не подходила.
Просто я попроще вопрос решил задать, т.к. думал, что есть какая-нить стандартная ф-ция для округления, но ее не оказалось.  smile    
А  простые вычисления(типа таких как вы написали) округляются без проблем  smile  
PM MAIL   Вверх
Дмитрий Т
Дата 11.7.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 16.3.2005
Где: Самара

Репутация: 4
Всего: 4



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


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

round появилась в языке Си в стандарте C99, а в С++ как известно входит только C89 так что этой функции в C++ пока нет.
PM MAIL WWW ICQ Skype   Вверх
s_a_s_h_a
Дата 31.5.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



 smile 

Это сообщение отредактировал(а) s_a_s_h_a - 1.6.2011, 08:27
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1490 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.