Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Об округлении в Delphi. [D7]


Айдар ©   (2012-12-14 05:51:00) 

Всем привет! Возникла проблема с округлением. Дан интервал [x1;x2], мне нужно найти произведение всех целочисленных отрицательных чисел входящих в данный промежуток. Вот "кусок" программы: x1:=strtofloat(edit1.Text);
x2:=strtofloat(edit2.Text);
K:=1;
If x2<x1 Then
Label3.Caption:='Неправильно заданы границы интервала [x1,x2]'
Else begin
xmin:=trunc(x1);
xmax:=trunc(x2);
For i:=xmin to xmax do
If (i<0) Then K:=K*i;
f1book1.numberrc[2,4]:=K;
end;
Если вводить в интервал целые числа, то программа работает правильно, но при введении в интервал дробных чисел программа считает неправильно. Например дан интервал [-10;-8,1], trunc x1=-10, trunc x2=-9, следовательно произведение целочисленных отрицательных чисел в данном промежутке равно 90, но программа выводит как -720. Подскажите пожалуйста, как это исправить? Спасибо за внимание.


Inovet   (2012-12-14 19:06:00) [1]

> [4] O'ShinW ©   (14.12.12 09:02)
> проще подойти формально

Правильно - вспомнить математику и сделать без перебора.


O'ShinW   (2012-12-14 09:02:00) [2]

проще подойти формально - пока меньше, множь

var
 x1,x2: Double;
 i, K: Integer;
begin
 x1 := -10;
 x2 := -8.1;
 K:=1;
 If x2<x1 Then
   Exit Else
 begin
   i := Round(int(x1));
   while i < x2 do
   begin
     K := K*i;
     inc(i);
   end;
   ShowMessageFmt('%f %f %d',[x1, x2, K]);
 end;
end;


Inovet   (2012-12-14 06:23:00) [3]

Ну и Ceil для первого


Inovet   (2012-12-14 06:20:00) [4]

Floor


Inovet   (2012-12-14 06:15:00) [5]

> [0] Айдар   (14.12.12 05:51)
> Например дан интервал [-10;-8,1], trunc x1=-10, trunc x2=-9

Неправда, Trunc(-8.1) = -8

И зачем в цикле проверять i<0, когда можно пер циклом проверить
xmax:=trunc(x2);

if(xmax) >= 0 then xmax := -1;


Наверх

Титульная страница Поиск, карта сайта Написать письмо