Округление

Округление - Messages

#1 Posted: 1/10/2013 12:46:24 AM
Serg

Serg

7 likes in 105 posts.

Group: Moderator

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

Serg

7 likes in 105 posts.

Group: Moderator

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

Serg

7 likes in 105 posts.

Group: Moderator

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

Mike Kaganski

184 likes in 434 posts.

Group: 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 Posted: 1/10/2013 1:38:03 AM
Serg

Serg

7 likes in 105 posts.

Group: 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 Posted: 1/10/2013 1:45:11 AM
Mike Kaganski

Mike Kaganski

184 likes in 434 posts.

Group: 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 users liked this post
Serg 1/10/2013 1:55:00 AM
#7 Posted: 1/10/2013 1:57:54 AM
Serg

Serg

7 likes in 105 posts.

Group: 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 Posted: 1/10/2013 2:04:04 AM
Mike Kaganski

Mike Kaganski

184 likes in 434 posts.

Group: User

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

[MATH lang=eng]myceil(x,prec)round(x/prec,0)+(mod(x,prec)>0))*prec[/MATH]
С уважением, Михаил Каганский
#9 Posted: 1/10/2013 2:10:44 AM
Serg

Serg

7 likes in 105 posts.

Group: 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 Posted: 1/10/2013 2:17:06 AM
Mike Kaganski

Mike Kaganski

184 likes in 434 posts.

Group: 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 users liked this post
Serg 1/10/2013 2:20:00 AM
#11 Posted: 1/10/2013 2:20:20 AM
Serg

Serg

7 likes in 105 posts.

Group: 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 Posted: 1/10/2013 4:09:22 AM
Mike Kaganski

Mike Kaganski

184 likes in 434 posts.

Group: User

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

[MATH lang=eng]myceil2(x,prec)trunc(x/prec)+sign(mod(x,prec)))*prec[/MATH]
С уважением, Михаил Каганский
  • New Posts New Posts
  • No New Posts No New Posts