Округление

Округление - Сообщения

#1 Опубликовано: 10.01.2013 00:46:24
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Всем привет!
Столкнулся с необходимостью округления в программе до заданной точности, к примеру число 524 нужно округлить до ближайших 50 в большую сторону, т.е. чтобы получилось 550. Штатной функцией roud не выходит.
Ученье свет!
#2 Опубликовано: 10.01.2013 01:08:40
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Единственное что нашел это поделить число на 100, затем округлить до целого, его умножить снова на 100 и к получившемуся числу прибавить 500 (527/100=5,27 --- 5,0*100+50=550). Может как то проще можно сделать?
Ученье свет!
#3 Опубликовано: 10.01.2013 01:22:02
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Не всегда корректно это работает (например для 263 выходит ближайшее 350, а должно быть 300, надо условие написать)
Ученье свет!
#4 Опубликовано: 10.01.2013 01:25:45
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

Это, конечно, банальность, но ведь это можно оформить функцией и пользоваться не задумываясь?

[MATH lang=eng]myround(x,prec):round(x*10^prec,0)*10^-prec[/MATH]

[MATH lang=eng]myround(527,-2)=500[/MATH]

[MATH lang=eng]myround(263,-2)=300[/MATH]

Edit: надо блин читать внимательнее. Прошу прощения, про большую сторону не прочитал.
С уважением, Михаил Каганский
#5 Опубликовано: 10.01.2013 01:38:03
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Wrote

Это, конечно, банальность, но ведь это можно оформить функцией и пользоваться не задумываясь?

[MATH lang=eng]myround(x,prec):round(x*10^prec,0)*10^-prec[/MATH]

[MATH lang=eng]myround(527,-2)=500[/MATH]

[MATH lang=eng]myround(263,-2)=300[/MATH]




Ну второе выражение правильно вычисляется - 263 округляется до ближайших 50 в большую сторону и выходит 300.
А вот с первым выражением не согласен - 527 с округлением в большую сторону должно быть 550, а у вас выходит 500.
Ученье свет!
#6 Опубликовано: 10.01.2013 01:45:11
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(x/prec>round(x/prec,0)))*prec[/MATH]

[MATH lang=eng]myceil(263,50)=300[/MATH]

[MATH lang=eng]myceil(527,50)=550[/MATH]

Или короче

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(mod(x/prec,1)>0))*prec[/MATH]
С уважением, Михаил Каганский
1 пользователям понравился этот пост
Serg 10.01.2013 01:55:00
#7 Опубликовано: 10.01.2013 01:57:54
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Wrote

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(x/prec>round(x/prec,0)))*prec[/MATH]

[MATH lang=eng]myceil(263,50)=300[/MATH]

[MATH lang=eng]myceil(527,50)=550[/MATH]

Или короче

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(mod(x/prec,1)>0))*prec[/MATH]



Вариант 1 работает корректно, а вот 2 вариант не очень. Спасибо
Ученье свет!
#8 Опубликовано: 10.01.2013 02:04:04
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

Лучше даже так:

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(mod(x,prec)>0))*prec[/MATH]
С уважением, Михаил Каганский
#9 Опубликовано: 10.01.2013 02:10:44
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Wrote

Лучше даже так:

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(mod(x,prec)>0))*prec[/MATH]



В этом случае при значении 527 функция округляет до 600, а должна до 550

При значении 524 округляет до 550, а уже при 525 до 600, хотя в обоих случаях должна округлять до 550
Ученье свет!
#10 Опубликовано: 10.01.2013 02:17:06
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

Wrote

В этом случае при значении 527 функция округляет до 600, а должна до 550

При значении 524 округляет до 550, а уже при 525 до 600, хотя в обоих случаях должна округлять до 550



Вы правы, вот как должно быть:

[MATH lang=eng]myceil(x,prec)trunc(x/prec)+(mod(x,prec)>0))*prec[/MATH]
С уважением, Михаил Каганский
1 пользователям понравился этот пост
Serg 10.01.2013 02:20:00
#11 Опубликовано: 10.01.2013 02:20:20
Serg

Serg

7 сообщений из 105 понравились пользователям.

Группа: Moderator

Wrote

Wrote

В этом случае при значении 527 функция округляет до 600, а должна до 550

При значении 524 округляет до 550, а уже при 525 до 600, хотя в обоих случаях должна округлять до 550



Вы правы, вот как должно быть:

[MATH lang=eng]myceil(x,prec)trunc(x/prec)+(mod(x,prec)>0))*prec[/MATH]



Ок. Спасибо. Теперь все работает
Ученье свет!
#12 Опубликовано: 10.01.2013 04:09:22
Mike Kaganski

Mike Kaganski

184 сообщений из 434 понравились пользователям.

Группа: User

Если требуется, чтобы функция обрабатывала отрицательные значения, приводя к ближайшему большему по абсолютному значению, можно использовать это:

[MATH lang=eng]myceil2(x,prec)trunc(x/prec)+sign(mod(x,prec)))*prec[/MATH]
С уважением, Михаил Каганский
  • Новые сообщения Новые сообщения
  • Нет новых сообщений Нет новых сообщений