Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.008 c
1-17633
Krok
2002-04-22 19:11
2002.05.06
XML


4-17730
TCP
2002-03-01 18:49
2002.05.06
Треей и ДАта


1-17600
Egor111
2002-04-22 17:23
2002.05.06
TListBox


3-17501
Filat
2002-04-12 15:44
2002.05.06
Не стартует 7.0? Ошибка 1069 !!! Что делать?


4-17731
Анонимщик
2002-03-01 13:52
2002.05.06
Как программно изменить чувствительность мышиного курсора к перемещениям колесика мышки?




   Наверх