Выровнить/Округлить число по мат правилам
От: .alex Ниоткуда  
Дата: 06.09.10 19:23
Оценка:
Добрый день. Подскажите как выронить число с заданной кратностью при этом округлив его по математическим правилам (т.е. до 0.4 округляется в 0, от 0.5 в 1). Вряд ли понятно задал вопрос, лучше покажу примером.
Есть кратность допустим 50
и есть число 148, его надо округлить до 150
280 до 300
885 до 900
а вот 327 до 300
И так же для дробных, например при кратности 0.10
0.48 до 0.50
0.68 до 0.70
а — 0.72 до 0.70
ЗЫ. заранее извиняюсь за сумбурность вопроса.
Re: Выровнить/Округлить число по мат правилам
От: Буравчик Россия  
Дата: 06.09.10 19:30
Оценка: 1 (1)
Здравствуйте, .alex, Вы писали:

A>Есть кратность допустим 50

A>и есть число 148, его надо округлить до 150
A>280 до 300
A>885 до 900
A>а вот 327 до 300
A>И так же для дробных, например при кратности 0.10
A>0.48 до 0.50
A>0.68 до 0.70
A>а — 0.72 до 0.70

// n — округляемое число
// p — кратность
double smart_round(double n, double p)
{
return round (n / p) * p;
}

round — округляет к ближайшему целому — зависит от языка/платформы
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Best regards, Буравчик
Re[2]: Выровнить/Округлить число по мат правилам
От: morm Россия  
Дата: 07.09.10 04:56
Оценка: +1
Здравствуйте, Буравчик, Вы писали:

Б>Здравствуйте, .alex, Вы писали:


A>>Есть кратность допустим 50

A>>и есть число 148, его надо округлить до 150
A>>280 до 300
A>>885 до 900
A>>а вот 327 до 300
A>>И так же для дробных, например при кратности 0.10
A>>0.48 до 0.50
A>>0.68 до 0.70
A>>а — 0.72 до 0.70

Б>// n — округляемое число

Б>// p — кратность
Б>double smart_round(double n, double p)
Б>{
Б> return round (n / p) * p;
Б>}

Б>round — округляет к ближайшему целому — зависит от языка/платформы


при этом round —
double round(double n)
{
return floor(n + 0.5);
}
Re[3]: Выровнить/Округлить число по мат правилам
От: Буравчик Россия  
Дата: 07.09.10 08:11
Оценка:
Здравствуйте, morm, Вы писали:

M>при этом round —

M>double round(double n)
M>{
M> return floor(n + 0.5);
M>}

Не сработает для отрицательных чисел.
round(-3.8) = -4
floor(-3.8 + 0.5) = floor(-3.3) = -3
Best regards, Буравчик
Re[2]: Выровнить/Округлить число по мат правилам
От: .alex Ниоткуда  
Дата: 07.09.10 08:45
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Здравствуйте, .alex, Вы писали:


A>>Есть кратность допустим 50

A>>и есть число 148, его надо округлить до 150
A>>280 до 300
A>>885 до 900
A>>а вот 327 до 300
A>>И так же для дробных, например при кратности 0.10
A>>0.48 до 0.50
A>>0.68 до 0.70
A>>а — 0.72 до 0.70

Б>// n — округляемое число

Б>// p — кратность
Б>double smart_round(double n, double p)
Б>{
Б> return round (n / p) * p;
Б>}

Б>round — округляет к ближайшему целому — зависит от языка/платформы


Спасибо. я сделал раунд так, вроде работает
int round(double n) {return (int)(n + 0.5)}
Re[4]: Выровнить/Округлить число по мат правилам
От: _DAle_ Беларусь  
Дата: 07.09.10 09:17
Оценка: 1 (1)
Здравствуйте, Буравчик, Вы писали:

Б>Здравствуйте, morm, Вы писали:


M>>при этом round —

M>>double round(double n)
M>>{
M>> return floor(n + 0.5);
M>>}

Б>Не сработает для отрицательных чисел.

Б>round(-3.8) = -4
Б>floor(-3.8 + 0.5) = floor(-3.3) = -3

http://codepad.org/IM5XvEBr
Re[3]: Выровнить/Округлить число по мат правилам
От: gegMOPO4  
Дата: 07.09.10 10:31
Оценка:
Здравствуйте, .alex, Вы писали:
A>Спасибо. я сделал раунд так, вроде работает
A>int round(double n) {return (int)(n + 0.5)}

И чему равно round(-0.9)?

Правильно — использовать библиотечные round, nearbyint или rint (в зависимости от требуемого округления). В старину пользовались следующим костылём:
int round(double n) {return (int)floor(n + 0.5)}
Re[4]: Выровнить/Округлить число по мат правилам
От: morm Россия  
Дата: 08.09.10 04:53
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Не сработает для отрицательных чисел.

Б>round(-3.8) = -4
Б>floor(-3.8 + 0.5) = floor(-3.3) = -3


double round(double n)
{
  double sgn = 1 - 2*(n<0);     
  return floor(n + 0.5*sgn);
}
Re: Выровнить/Округлить число по мат правилам
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 08.09.10 10:06
Оценка:
Здравствуйте, .alex, Вы писали:

A>Добрый день. Подскажите как выронить число с заданной кратностью при этом округлив его по математическим правилам (т.е. до 0.4 округляется в 0, от 0.5 в 1). Вряд ли понятно задал вопрос, лучше покажу примером.

A>Есть кратность допустим 50
A>и есть число 148, его надо округлить до 150
A>280 до 300
A>885 до 900
A>а вот 327 до 300
A>И так же для дробных, например при кратности 0.10
A>0.48 до 0.50
A>0.68 до 0.70
A>а — 0.72 до 0.70
A>ЗЫ. заранее извиняюсь за сумбурность вопроса.

К вышенаписанному добавлю свои 5 копеек.
Чтобы получить точность округления — округлить десятичный логарифм числа в меньшую сторону и вычесть 1.
Затем результат потенцировать по основанию 10. Это точность округления а не его результат. То есть p в формуле round (n / p) * p. Например для 148 точность будет 10.
Re[5]: Выровнить/Округлить число по мат правилам
От: sergey.p. Великобритания  
Дата: 08.09.10 10:14
Оценка:
Здравствуйте, morm, Вы писали:

M>
M>double round(double n)
M>{
M>  double sgn = 1 - 2*(n<0);     
M>  return floor(n + 0.5*sgn);
M>}

M>


Этот branch будет стоить дороже всего остального кода функции)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.