| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Александр Участник

Зарегистрирован: 01.05.2007 Сообщения: 73
Статус: Отсутствует на форуме Очки: 0 |
Заголовок сообщения: float Добавлено: Вс Фев 21, 2010 0:27 |
|
|
Как округлить 6,05999994277954 к большему числу
типа:
6,06 (использование сотых, обязательно)
|
|
|
| Вернуться к началу |
|
 |
Tantos Ветеран

Зарегистрирован: 13.10.2004 Сообщения: 1177 Откуда: Хабаровск Статус: Сейчас на форуме! Очки: 141 |
Заголовок сообщения: Добавлено: Вс Фев 21, 2010 7:45 |
|
|
Если BCB>=6, то FormatFloat. Если нет, поиск по форуму с ключевым словом "округление".
|
_________________ Чем больше узнаю людей, тем больше люблю компьютеры. |
|
| Вернуться к началу |
|
 |
XPyCT Участник

Зарегистрирован: 07.06.2007 Сообщения: 83
Статус: Отсутствует на форуме Очки: 0 |
Заголовок сообщения: Добавлено: Пт Мар 12, 2010 14:01 |
|
|
предположим у вас есть переменная float Result = 6,05999994277954;
результат выводим в едит
| Код: |
Edit1->Text - FloatToStrF(Result,ffFixed,10,2);
|
2 -Это количество знаков после запятой
результат будет 6,05
пс - Для получения округленного значения переменной Result, надо записать:
| Код: |
#lnclude <math.h>
.....
floor(Result+0.5);
|
|
|
|
| Вернуться к началу |
|
 |
day Новенький

Зарегистрирован: 22.01.2009 Сообщения: 5 Откуда: Москва Статус: Отсутствует на форуме Очки: 0 |
Заголовок сообщения: Re: float Добавлено: Вс Сен 05, 2010 22:34 |
|
|
| Александр писал(а): |
Как округлить 6,05999994277954 к большему числу
типа:
6,06 (использование сотых, обязательно) |
Тебе нужно именно до сотых? Тогда существует куча способов, некоторые из которых тебе были показаны.
Но ежели надо остановиться когда встречается несколько девяток...
Тут, пожалуй, ничего умнее не придумать, как вывести число в строку char с максимальной точностью и побайтно анализировать.
Если так, свистни, я когда-то этим занимался.
|
|
|
| Вернуться к началу |
|
 |
Zardoz Завсегдатай

Зарегистрирован: 04.08.2005 Сообщения: 537 Откуда: Донецк, Украина Статус: Сейчас на форуме! Очки: 0 |
Заголовок сообщения: Добавлено: Пн Сен 06, 2010 20:31 |
|
|
Да всё это не то, что нужно. Не надо из числа делать строку и еще как-то анализировать там... А если не дай Бог еще и много операций делать с этими "числами-строками" - жуть...
Делаем проще - передвигаем запятую вправо на нужное кол-во знаков, затем округляем и потом возвращаем запятую (x-аргумент, y-результат):
| Код: |
y=floor(0.5+x*100)/100; - округление до 2-го знака
y=floor(0.5+x*1000)/1000; - округление до 3-го знака
y=floor(0.5+x*10000)/10000; - округление до 4-го знака
...
y=floor(0.5+x*pow(10,N))/pow(10,N); - округление до заданного N-го знака
|
Можно оформить в виде функции, если в самом деле нет готовой (сам пользуюсь Дельфи), множитель 100, 1000, .. и т.д. задается степенью N числа 10 и т.о. получим функцию округления в виде одной строчки с заданным N (последння строка с показателем степени N).
С уважением.
P.S. Для отрицательных чисел x, возможно следует перед 0.5 поставить "-" (можно знаковой функцией)
|
|
|
| Вернуться к началу |
|
 |
day Новенький

Зарегистрирован: 22.01.2009 Сообщения: 5 Откуда: Москва Статус: Отсутствует на форуме Очки: 0 |
Заголовок сообщения: Добавлено: Вт Сен 07, 2010 19:09 |
|
|
Zardoz, Если кол-во знаков известно, тут вообще проблем нет.
Способов - море, твой - один из них.
У меня-то была другая проблемка нужно было ОПРЕДЕЛИТЬ количество
знаков.
Т.е. округлять так:
1.20023 = 1.2
1.234009945 = 1.234
1.299657 = 1.3
1.0909129908 = 1.090913
|
|
|
| Вернуться к началу |
|
 |
Zardoz Завсегдатай

Зарегистрирован: 04.08.2005 Сообщения: 537 Откуда: Донецк, Украина Статус: Сейчас на форуме! Очки: 0 |
Заголовок сообщения: Добавлено: Вт Сен 07, 2010 20:44 |
|
|
day.
Мой способ (на самом деле и не мой), это НЕ "один из них", а классический. Менее распространено округление по Гауссу.
И что значит число знаков неизвестно? Округление как раз и выполняется по заданному числу знаков.
А выполни округление (или число знаков), по своему способу дроби 13/7. Что у тебя получится?
С уважением.
|
|
|
| Вернуться к началу |
|
 |
day Новенький

Зарегистрирован: 22.01.2009 Сообщения: 5 Откуда: Москва Статус: Отсутствует на форуме Очки: 0 |
Заголовок сообщения: Добавлено: Вчера в 12:10 |
|
|
Zardoz, это просто разные задачи. Моя возникла как попытка скорректировать накапливающиеся погрешности вычислений на компутере. Представь, юзер считает столбиком и получает 1.23,
а я ему - 1.22999.
Мы-то с тобой все понимаем, а вот юзеру не объяснишь, и он по своему прав.
Что касается 13/7, то конечно, максимальное кол-во знаков должно быть задано.
Кстати, вот еще симпатичная задачка, представить дроби типа
этой как в школе велят, т.е. 13/7 = 1.(857142)
|
|
|
| Вернуться к началу |
|
 |
Nuzhny Модератор


Зарегистрирован: 23.02.2004 Сообщения: 2339 Откуда: Ставрополь Статус: Сейчас на форуме! Очки: 1010 |
Заголовок сообщения: Добавлено: Вчера в 16:48 |
|
|
Различные мат. пакеты (Matlab, Maple, Mathcad) могут использовать внутри себя символьные вычисления, поэтому у них проблем с округлением (а по сути с преобразованием в двоичный формат и обратно) вообще не бывает. Аналогично и с финансовыми вычислениями - только символьное представление чисел.
|
|
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|