Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Округление типа Extended


KIR ©   (2002-04-19 09:52:00) 

Возникает следующая ситуация: при расчете 50*31.15 получается число 1557.5, я пишу FormatFloat("0", 50*31.15), результат - 1557, хотя должен быть 1558. Открываю новый проект, кидаю Label, Edit и Button. Пишу след. код:
procedure OnButton1Click;
begin
Label.Caption := FormatFloat("0",StrToFloat(Edit1.Text));
end;
Забиваю в Edit число 1557,5, нажимаю на кнопку - результат 1558. Где ошибка?


MBo   (2002-04-22 14:05:00) [1]

ну почему 1557 истина?
мне кажется, нельзя Так сказать. Ведь правила округления чисел с .5 дробной частью выбраны произвольно, как начало строевого шага с левой ноги ;)
Такие веши надо просто учитывать. На delphi.vitpc.com есть статья "Неочевидные особенности вещественных чисел", где еще кое-какие подводные камни бакенами отмечены.


KIR   (2002-04-22 13:29:00) [2]

Прочитал ответ MBo, и призадумался, на самом деле выходит, что истина-то - это - 1557, а не 1558... значить все работает нормально.


Ptushenko Denis   (2002-04-19 11:05:00) [3]

Используй
Trunc

--->> trunc(1557.4999999)
и это сто пудов даст 1557 и даже
trunc(1557.9999999) даст 1557


MBo   (2002-04-19 10:49:00) [4]

Причина различий - в машинном представлении чисел.
1557.5 представлено точно- дробная часть 1/2, а округление таких происходит к ЧЕТНОМУ целому - так уж сопроцессор работает.
31.15 нельзя в двоичном виде точно записать, и, умножив на 50, получаем чуть меньшее 1557.5 число, которое, естественно, округляется до 1557.

P.S.
В грузинской школе урок русского
Кон пишется с мягким знаком, а тарелька - без.
Понять это невозможно, это надо запомнить


Johnmen   (2002-04-19 10:20:00) [5]

>KIR © : В чем различие указанных проектов ?


gek   (2002-04-19 10:15:00) [6]

попробуй так

function FormatReal(r:real):real;
begin
Result:=StrToFloat(FloatToStrF(r,ffFixed,12,2));
end;



Alx2   (2002-04-19 10:04:00) [7]

Может, попробовать специфику типа Currency и сопровождающие его функции?


Alx2   (2002-04-19 10:01:00) [8]

Попробуй для этого: 50*31.15 + 1E-18


KIR   (2002-04-19 10:01:00) [9]

Да, ты прав, но если округлить до целого, например, Round(31.15*50), то будет 1558, если ты помнишь, то при 5 после запятой происходит округление в большую сторону. В моем же случае что в одном проекте что Round(31.15*50), что FormatFloat("0",31.15*50) дает 1557, а вдругом 1558.


Johnmen   (2002-04-19 09:57:00) [10]

50*31.15 = 1557.4999999...


Наверх

Титульная страница Поиск, карта сайта Написать письмо