Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.06;
Скачать: [xml.tar.bz2];

Вниз

Округление типа 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.005 c
3-17484
SB.John
2002-04-12 08:43
2002.05.06
TQuery + TDBImage не работают


7-17716
dorixe
2002-01-03 16:57
2002.05.06
Мониторы


14-17671
Fellomena
2002-03-28 17:08
2002.05.06
BreakPoints in Delphi6 (inside)


1-17513
Billy
2002-04-21 03:36
2002.05.06
Битая Делфа


1-17562
Vint
2002-04-17 22:10
2002.05.06
Редактор компонент...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский