Русскоязычный форум закрыт из-за отсутствия активности (доступен только для чтения).
Пожалуйста, пользуйтесь англоязычной его версией. Приносим извинения за неудобства
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Вход


Опции
К последнему сообщению К первому непрочитанному
Offline genf  
#1 Оставлено : 10 января 2013 г. 7:46:24(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Всем привет!
Столкнулся с необходимостью округления в программе до заданной точности, к примеру число 524 нужно округлить до ближайших 50 в большую сторону, т.е. чтобы получилось 550. Штатной функцией roud не выходит.
Ученье свет!

Wanna join the discussion?! Login to your Форум проекта SMath forum account. Новые регистрации запрещены.

Offline genf  
#2 Оставлено : 10 января 2013 г. 8:08:40(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Единственное что нашел это поделить число на 100, затем округлить до целого, его умножить снова на 100 и к получившемуся числу прибавить 500 (527/100=5,27 --- 5,0*100+50=550). Может как то проще можно сделать?
Ученье свет!
Offline genf  
#3 Оставлено : 10 января 2013 г. 8:22:02(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Не всегда корректно это работает (например для 263 выходит ближайшее 350, а должно быть 300, надо условие написать)
Ученье свет!
Offline mikekaganski  
#4 Оставлено : 10 января 2013 г. 8:25:45(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
Это, конечно, банальность, но ведь это можно оформить функцией и пользоваться не задумываясь?

myround(x,prec):round(x*10^prec,0)*10^-prec

myround(527,-2)=500

myround(263,-2)=300

Edit: надо блин читать внимательнее. Прошу прощения, про большую сторону не прочитал.

Отредактировано пользователем 10 января 2013 г. 8:39:36(UTC)  | Причина: Не указана

С уважением,
Михаил Каганский
Offline genf  
#5 Оставлено : 10 января 2013 г. 8:38:03(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Автор: mikekaganski Перейти к цитате
Это, конечно, банальность, но ведь это можно оформить функцией и пользоваться не задумываясь?

myround(x,prec):round(x*10^prec,0)*10^-prec

myround(527,-2)=500

myround(263,-2)=300



Ну второе выражение правильно вычисляется - 263 округляется до ближайших 50 в большую сторону и выходит 300.
А вот с первым выражением не согласен - 527 с округлением в большую сторону должно быть 550, а у вас выходит 500.
Ученье свет!
Offline mikekaganski  
#6 Оставлено : 10 января 2013 г. 8:45:11(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
myceil(x,prec)Sadround(x/prec,0)+(x/prec>round(x/prec,0)))*prec

myceil(263,50)=300

myceil(527,50)=550

Или короче

myceil(x,prec)Sadround(x/prec,0)+(mod(x/prec,1)>0))*prec

Отредактировано пользователем 10 января 2013 г. 8:54:44(UTC)  | Причина: Не указана

С уважением,
Михаил Каганский
thanks 1 пользователь поблагодарил mikekaganski за этот пост.
genf оставлено 10.01.2013(UTC)
Offline genf  
#7 Оставлено : 10 января 2013 г. 8:57:54(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Автор: mikekaganski Перейти к цитате
myceil(x,prec)Sadround(x/prec,0)+(x/prec>round(x/prec,0)))*prec

myceil(263,50)=300

myceil(527,50)=550

Или короче

myceil(x,prec)Sadround(x/prec,0)+(mod(x/prec,1)>0))*prec


Вариант 1 работает корректно, а вот 2 вариант не очень. Спасибо
Ученье свет!
Offline mikekaganski  
#8 Оставлено : 10 января 2013 г. 9:04:04(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
Лучше даже так:

myceil(x,prec)Sadround(x/prec,0)+(mod(x,prec)>0))*prec
С уважением,
Михаил Каганский
Offline genf  
#9 Оставлено : 10 января 2013 г. 9:10:44(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Автор: mikekaganski Перейти к цитате
Лучше даже так:

myceil(x,prec)Sadround(x/prec,0)+(mod(x,prec)>0))*prec


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

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

Отредактировано пользователем 10 января 2013 г. 9:13:11(UTC)  | Причина: Не указана

Ученье свет!
Offline mikekaganski  
#10 Оставлено : 10 января 2013 г. 9:17:06(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
Автор: genf Перейти к цитате
В этом случае при значении 527 функция округляет до 600, а должна до 550

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


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

myceil(x,prec)Sadtrunc(x/prec)+(mod(x,prec)>0))*prec
С уважением,
Михаил Каганский
thanks 1 пользователь поблагодарил mikekaganski за этот пост.
genf оставлено 10.01.2013(UTC)
Offline genf  
#11 Оставлено : 10 января 2013 г. 9:20:20(UTC)
genf


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Мужчина
Российская Федерация

Сказал «Спасибо»: 311 раз
Поблагодарили: 7 раз в 6 постах
Автор: mikekaganski Перейти к цитате
Автор: genf Перейти к цитате
В этом случае при значении 527 функция округляет до 600, а должна до 550

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


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

myceil(x,prec)Sadtrunc(x/prec)+(mod(x,prec)>0))*prec


Ок. Спасибо. Теперь все работает Clap
Ученье свет!
Offline mikekaganski  
#12 Оставлено : 10 января 2013 г. 11:09:22(UTC)
mikekaganski


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Мужчина
Российская Федерация
Откуда: Khabarovsk, Russia

Сказал «Спасибо»: 130 раз
Поблагодарили: 33 раз в 29 постах
Если требуется, чтобы функция обрабатывала отрицательные значения, приводя к ближайшему большему по абсолютному значению, можно использовать это:

myceil2(x,prec)Sadtrunc(x/prec)+sign(mod(x,prec)))*prec
С уважением,
Михаил Каганский
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.