![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Об округлении в 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;