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

Быстрое округление числа - C++

Восстановить пароль Регистрация
 
The special one
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
26.02.2013, 11:29     Быстрое округление числа #1
Здравствуйте уважаемые программисты! Подскажите как быстрее всего округлить число?
C++
1
double a = 4.78531
необходимо получить
C++
1
a = 4.80000
Я знаю один способ
C++
1
a = double(int(a*10 + 0.5))/10
Есть еще варианты?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 11:29     Быстрое округление числа
Посмотрите здесь:

C++ округление числа до десятых
C++ Округление мелкого числа до 0
C++ Округление дробового числа
C++ Округление числа
быстрое нахождение количества делителей натурального числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
26.02.2013, 11:43     Быстрое округление числа #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
#include <math.h>
 
int main(int argc, char* argv[])
{
    int s = 10; // Точность. Сколько после запятой.
    double number = 4.78531;
    double down, up;
 
    down = floor(number*s)/s;
    up = ceil(number*s)/s;
 
    printf("original number     %5.5lf\n", number);
    printf("number rounded down %5.5lf\n", down);
    printf("number rounded up   %5.5lf\n", up);
 
 
cin.ignore(1);
return 0;
}
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
26.02.2013, 11:46     Быстрое округление числа #3
Можно пробовать через функции ceil и floor (из библиотеки cmath). Только тут есть проблема, мы не можем округлять числа с точкой, но можно выкрутиться так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <cmath>
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    double l = 4.576332;
 
    double n = std::ceil(l*1000)/1000;
 
    std::cout << n << std::endl;
    
   return 0;
}
На выходе получим 3.577

Если что, вот поясняю, что мы делаем:
1) Умножаем наше числа на нужную степень десятки(десятые, сотые, тысячные и т.д.)
2) С помощью функций floor(округление в меньшую сторону) или ceil(в большую) мы округляем наше число.
3) Делим число на нашу степень.

Грубо говоря, это тоже самое, что у тебя, просто сделано чуть по другому

эххх, SatanaXIII опередил
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
26.02.2013, 11:55     Быстрое округление числа #4
Цитата Сообщение от Psixodelik Посмотреть сообщение
эххх, SatanaXIII опередил

А пример из справки опередил даже меня.
Но с
C++
1
2
3
int s = 10000;
double a = 4.78531;
a = double(int(a*s + 0.5))/s;
тоже прикольно. Только в профиль.
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
26.02.2013, 11:59     Быстрое округление числа #5
Цитата Сообщение от SatanaXIII Посмотреть сообщение

А пример из справки опередил даже меня.
Но с
C++
1
2
3
int s = 10000;
double a = 4.78531;
a = double(int(a*s + 0.5))/s;
тоже прикольно. Только в профиль.
Так это грубо говоря и есть то, что знает ТС )
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,332
Завершенные тесты: 1
26.02.2013, 12:19     Быстрое округление числа #6
Psixodelik, я за то, что будет ли в таком двойном преобразовании ошибок (при переносе на 64, при больших значениях и так далее)? Я думаю, скорее всего это надо будет все ловить руками, а в ceil и floor как-то хочется верить, что уже все продумано.

P.S. Но вообще
C++
1
double(int(a*s + 0.5))/s;
- красиво - не надо math за собой тащить.
Yandex
Объявления
26.02.2013, 12:19     Быстрое округление числа
Ответ Создать тему
Опции темы

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