Статус: Advanced Member
Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Сказал «Спасибо»: 311 раз Поблагодарили: 7 раз в 6 постах
Всем привет! Столкнулся с необходимостью округления в программе до заданной точности, к примеру число 524 нужно округлить до ближайших 50 в большую сторону, т.е. чтобы получилось 550. Штатной функцией roud не выходит.
Ученье свет!
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Сказал «Спасибо»: 311 раз Поблагодарили: 7 раз в 6 постах
Единственное что нашел это поделить число на 100, затем округлить до целого, его умножить снова на 100 и к получившемуся числу прибавить 500 (527/100=5,27 --- 5,0*100+50=550). Может как то проще можно сделать?
Ученье свет!
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Сказал «Спасибо»: 311 раз Поблагодарили: 7 раз в 6 постах
Не всегда корректно это работает (например для 263 выходит ближайшее 350, а должно быть 300, надо условие написать)
Ученье свет!
Статус: 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)
| Причина: Не указана
С уважением, Михаил Каганский
Статус: 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.
Ученье свет!
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Откуда: Khabarovsk, Russia
Сказал «Спасибо»: 130 раз Поблагодарили: 33 раз в 29 постах
myceil(x,prec) round(x/prec,0)+(x/prec>round(x/prec,0)))*prec myceil(263,50)=300 myceil(527,50)=550 Или короче
myceil(x,prec) round(x/prec,0)+(mod(x/prec,1)>0))*prec Отредактировано пользователем 10 января 2013 г. 8:54:44(UTC)
| Причина: Не указана
С уважением, Михаил Каганский
1 пользователь поблагодарил mikekaganski за этот пост.
genf оставлено 10.01.2013(UTC)
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Сказал «Спасибо»: 311 раз Поблагодарили: 7 раз в 6 постах
Вариант 1 работает корректно, а вот 2 вариант не очень. Спасибо
Ученье свет!
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Откуда: Khabarovsk, Russia
Сказал «Спасибо»: 130 раз Поблагодарили: 33 раз в 29 постах
Лучше даже так:
myceil(x,prec) round(x/prec,0)+(mod(x,prec)>0))*prec С уважением, Михаил Каганский
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Сказал «Спасибо»: 311 раз Поблагодарили: 7 раз в 6 постах
Автор: mikekaganski Лучше даже так:
myceil(x,prec) round(x/prec,0)+(mod(x,prec)>0))*prec В этом случае при значении 527 функция округляет до 600, а должна до 550
При значении 524 округляет до 550, а уже при 525 до 600, хотя в обоих случаях должна округлять до 550
Отредактировано пользователем 10 января 2013 г. 9:13:11(UTC)
| Причина: Не указана
Ученье свет!
Статус: 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) trunc(x/prec)+(mod(x,prec)>0))*prec С уважением, Михаил Каганский
1 пользователь поблагодарил mikekaganski за этот пост.
genf оставлено 10.01.2013(UTC)
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 02.12.2010(UTC)
Сообщений: 93
Сказал «Спасибо»: 311 раз Поблагодарили: 7 раз в 6 постах
Автор: mikekaganski Автор: genf В этом случае при значении 527 функция округляет до 600, а должна до 550 При значении 524 округляет до 550, а уже при 525 до 600, хотя в обоих случаях должна округлять до 550
Вы правы, вот как должно быть:
myceil(x,prec) trunc(x/prec)+(mod(x,prec)>0))*prec Ок. Спасибо. Теперь все работает
Ученье свет!
Статус: Advanced Member
Группы: Registered
Зарегистрирован: 19.03.2012(UTC)
Сообщений: 112
Откуда: Khabarovsk, Russia
Сказал «Спасибо»: 130 раз Поблагодарили: 33 раз в 29 постах
Если требуется, чтобы функция обрабатывала отрицательные значения, приводя к ближайшему большему по абсолютному значению, можно использовать это:
myceil2(x,prec) trunc(x/prec)+sign(mod(x,prec)))*prec С уважением, Михаил Каганский
Быстрый переход
Форум проекта SMath
SMath Studio
- Скачать SMath Studio
--- Архив
--- Ночные сборки
- Примеры использования
- Вопросы по использованию
- Предложения
- Ошибки
Математика
- Документы
- Алгоритмы
- Математические задачи
Общение
- О проекте
- Общение
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.