![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Округление типа 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...