Topic: Ошибка деления на ноль

Помогите пожалуйста подправить скрипт, чтобы исключить ошибки деления на ноль, которые появляются в следующих случаях:

- если случайно установить одинаковую дату начала и конца периода

- если время простоя "time lost" совпадает с продолжительностью периода "duration"

Re: Ошибка деления на ноль

Перед вычислением необходимо проверять значение делителя, чтобы он не был равен нулю, т.е. в скрипте нужно просто проверить что значение не равно нулю.


например

if (какое либо выражение) <> 0 then
begin
   // здесь прозводим вычисление
end;

также вы можете приложить свой проект с описанием шагов приводящих к этой ошибке.

Dmitry.

Re: Ошибка деления на ноль

Прилагаю проект

Post's attachments

Attachment icon dates.zip 338.04 kb, 384 downloads since 2016-02-13 

Re: Ошибка деления на ноль

vaskar wrote:

Прилагаю проект

DriveSoft wrote:

также вы можете приложить свой проект с описанием шагов приводящих к этой ошибке.

Dmitry.

Re: Ошибка деления на ноль

Дмитрий, сама математика описана в лейблах на форме.

Шаги, которые приводят к проблеме , такие:

Вписал одинаковую дату-время начала и окончания , появилась ошибка Invalid floating point operation

В случае, если  timelost (время простоя), окажется одинаковым с duration, появляется ошибка  Floating point division by zero

Re: Ошибка деления на ноль

Измените данные процедуры таким образом:



procedure Calculate_TCE;
begin
    if (frmVoyage.cbVoyBegins.Checked) and (frmVoyage.cbVoyEnds.Checked) and (frmVoyage.cbVoyEndsTime.Checked) and (frmVoyage.cbVoyBeginsTime.Checked) then
    begin
        if frmVoyage.eddurat.Value <> 0 then
            frmVoyage.edtce1.Value := frmVoyage.edRent.Value / frmVoyage.eddurat.Value;
    end;

end;

procedure Calculate_TCE2;
begin
    if (frmVoyage.cbVoyBegins.Checked) and (frmVoyage.cbVoyEnds.Checked) and (frmVoyage.cbVoyEndsTime.Checked) and (frmVoyage.cbVoyBeginsTime.Checked) then
    begin
        if (frmVoyage.eddurat.Value - frmVoyage.edlost.Value) <> 0 then
            frmVoyage.edtce2.Value := frmVoyage.edRent.Value / (frmVoyage.eddurat.Value - frmVoyage.edlost.Value);
    end;
end;


также я заметил, что кнопка "Add new" на форме Form1, имеет неверное действие, должно быть "New Record"

Dmitry.

Re: Ошибка деления на ноль

Дмитрий, спасибо за ликбез