Главная страница
    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.46 MB
Время: 0.004 c
1-17640
Vint
2002-04-15 21:35
2002.05.06
Кнопка с многострочной надписью...


1-17567
Masa
2002-04-22 12:34
2002.05.06
Object


7-17713
Nikolay
2002-02-09 14:29
2002.05.06
Вопрос...


14-17675
Mich Fryged
2002-03-28 23:29
2002.05.06
Помогите пожалуйста!


3-17475
rvs
2002-04-12 10:41
2002.05.06
Tquery





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский