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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2013, 11:39   #1
Program(m)er
Пользователь
 
Регистрация: 01.06.2013
Сообщений: 31
По умолчанию Недокругление

Привет.
Смотрю через BreakPoint-ы на выполнение программы. Из-за того, что 0.1 в двоичной системе будет бесконечным числом, на конце переменной у меня появляется остаток. Решил его убрать с помощью функции RoundTo. Пример кода:
Код:
Код:
A:Extended;
...
...
//В ходе вычислений получается, что A:=8,900000572240459;
A:=RoundTo(A,-4); // По логике вещей (если память о пятом классе мне не изменяет) должно получиться A:=8,900;
Result:=Points;      // Через BreakPoint-ы, вижу, что A:=8,89999961853027, а в программе - 8,899996 (это уже floatToStrf(A,ffGeneral,8,3) постарался)
Подскажите - почему так получается (почему получается так, что функция не округляет до 0.001)?
P.S. Мне очень важно получить тот результат, который я описал. Варианты с другими видами округления не подходят (на случай, если они существуют).
Program(m)er вне форума Ответить с цитированием
Старый 20.08.2013, 12:46   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,879
По умолчанию

Цитата:
Подскажите - почему так получается (почему получается так, что функция не округляет до 0.001)?
Округлять то она округляет. Но вас же не удивляет что 0.1 нельзя представить в двоичной системе точно. Так чем 8.9 лучше?
northener вне форума Ответить с цитированием
Старый 20.08.2013, 12:59   #3
Program(m)er
Пользователь
 
Регистрация: 01.06.2013
Сообщений: 31
По умолчанию

А как представить это число (хотя-бы на экране) как 8.9?
P.S. Если не сложно, можно пример кода?
Program(m)er вне форума Ответить с цитированием
Старый 20.08.2013, 13:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На отображение округлит FloatToStrF или если в компоненте, то DisplayFormat или что-то в этом роде.
Код:
FloatToStrF(8.89999961853027,ffFixed,8,3)
и даст 8.900. По поводу того, что в памяти см. #2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.08.2013, 13:06   #5
Program(m)er
Пользователь
 
Регистрация: 01.06.2013
Сообщений: 31
По умолчанию

А почему мой код не работал: floatToStrf(A,ffGeneral,8,3)

В чём разница между General и Fixed?

Последний раз редактировалось Stilet; 20.08.2013 в 20:07.
Program(m)er вне форума Ответить с цитированием
Старый 20.08.2013, 13:08   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А визуально не видно в чем разница? В хелпе почитай
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.08.2013, 13:10   #7
Program(m)er
Пользователь
 
Регистрация: 01.06.2013
Сообщений: 31
По умолчанию

Спасибо за помощь и за совет.
Program(m)er вне форума Ответить с цитированием
Старый 20.08.2013, 16:50   #8
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

можно проще совместить оба метода при выводе в текст.

Код:
str1:=floatToStr(RoundTo(A,-4))
P.S.
Я между прочим в свой код душу вкладываю!
Правда все равно говнокод получается...
Как думаете, это что-то значит?
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Старый 21.08.2013, 08:28   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Аватар, не "выделывайся" над человеком. Скажи, что тип данных указан не ворный. Я - сишник. С типовухой - проще. Компиль сам опреляет, где накосячил.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.08.2013, 09:27   #10
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

не тип, а правило округления. т.к. -4й элемент = 0 - по правилам округления и получается 8,900. но последние "ноли" обрезаются совершенно закономерно).
а чтобы отображение было с "нолями" в конце - нужно юзать, как указал Аватар, форматирование на предмет добавления недостающий "нолей".
Program(m)er, для примера, попробуй
Код:
RoundTo(A,-6)
и увидишь
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Ответ


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