Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2015, 16:08   #1
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию FloatToStrF округление

На примере:
Есть NUMERIC(12,2) поле в базе, значение 1513.00, в датасете AsFloat
делю на 2, результат в v: Double и делаю FloatToStrF(v,ffFixed,12,0)
результат не стабилен - или 756, или 757. То есть после деления имею в результате или 756.49999... или 756.50000...
Можно делать например FloatToStrF(v+0.01,ffFixed,12,0) и тогда всегда однозначно будет 757, что и нужно в данном случае
Но не задача - возможно деление не только на 2, а и на другие числа и добавка маленькой константы может всю малину испортить.

Хотелось бы услышать про другие способы обуздания округления в районе пятерки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.02.2015, 17:38   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я думаю никак. Как вариант после деления обрезать до двух разрядов после запятой и только потом проводить округление.
Вариант 2. Делить нацело. То есть умножаете Ваш НУМЕРИК на 100 и div 2. Получите однозначные не скачущие результаты.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 12.02.2015 в 17:41.
Utkin вне форума Ответить с цитированием
Старый 12.02.2015, 19:02   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
результат в v: Double
С Extended та же проблема?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.02.2015, 19:16   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Аватар, FloatToStrF не позволит тебе получить нормальный выход. Если уже делать эстетичное округление, то я бы советовал вычислять в SimpleRoundTo(), что позволит округлять по последнему разряду в большую сторону. Или RoundTo() - будет приводить округляемый разряд к ближайшему четному.
kta87 вне форума Ответить с цитированием
Старый 12.02.2015, 19:20   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
С Extended та же проблема?
А вот не пробовал. Нужно протестировать, возможно и поможет. Еще Currency. Та ситуация вообще удивляет - в методе только локальные переменные и датасет с другого юнита, для конкретного набора данных обращаюсь первый раз один результат, с теми же данными в последующие разы другой. Метод засунут в датамодуль, который создается динамически, по выходу убивается. Каждый раз все с чистого листа и это долбанное округление.
Цитата:
RoundTo
Не прокатит, банковское не нужно, да и в самой его реализации есть ошибки. SimpleRoundTo - в большую сторону тоже не фонтан
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.02.2015 в 19:25.
Аватар вне форума Ответить с цитированием
Старый 12.02.2015, 19:31   #6
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Еще Currency.
Тебе же в районе пятерки? или 4 это в районе пятерки?
kta87 вне форума Ответить с цитированием
Старый 12.02.2015, 19:53   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В районе пятерки значит - отбрасываемый десятичный разряд очень к ней близок. По поводу глючности Round и, соответственно RoundTo да и SimpleRoundTo можно примеры здесь посмотреть
http://www.delphikingdom.com/asp/vie...catalogID=1217
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.02.2015, 20:31   #8
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Round- уневерсальное округление. Округляет по математическим законам.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 12.02.2015, 20:53   #9
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Округление по направлению плюс бесконечности
Iron Monk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
округление govorun1 Общие вопросы Delphi 3 15.02.2014 18:54
Функция FloatToStrF Анастас Помощь студентам 2 31.10.2011 17:53
округление с++ kop Общие вопросы C/C++ 3 14.05.2011 16:01
Округление Madina192 Microsoft Office Access 6 29.04.2011 12:28
ОКРУГЛение Андрей_Васильевич Microsoft Office Excel 5 19.10.2009 09:09