Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.06;
Скачать: CL | DM;

Вниз

Округление типа Extended   Найти похожие ветки 

 
KIR ©   (2002-04-19 09:52) [0]

Возникает следующая ситуация: при расчете 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. Где ошибка?


 
Johnmen ©   (2002-04-19 09:57) [1]

50*31.15 = 1557.4999999...


 
Alx2 ©   (2002-04-19 10:01) [2]

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


 
KIR ©   (2002-04-19 10:01) [3]

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


 
Alx2 ©   (2002-04-19 10:04) [4]

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


 
gek ©   (2002-04-19 10:15) [5]

попробуй так

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




 
Johnmen ©   (2002-04-19 10:20) [6]

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


 
MBo ©   (2002-04-19 10:49) [7]

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

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


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

Используй
Trunc

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


 
KIR ©   (2002-04-22 13:29) [9]

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


 
MBo ©   (2002-04-22 14:05) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2002.05.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
4-17740
beaver
2002-03-02 13:58
2002.05.06
Приложение типа панели MSOffice


1-17617
Shadow
2002-04-22 18:57
2002.05.06
Файлы...


1-17618
Evgeny
2002-04-20 09:04
2002.05.06
многоугольник


14-17703
Roach
2002-03-18 12:26
2002.05.06
Games


14-17702
Alx2
2002-03-28 10:24
2002.05.06
Ветка о русском языке нашла продолжение в правительстве