Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Проблема округления даты (Double)  [new]
DimaBr
Member

Откуда:
Сообщений: 11910
Цель любого округления получить цельночисленное значение. Топикстартеру не нужно 0,9999999999 часов
18 ноя 20, 22:51    [22234986]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
rgreat
Member

Откуда:
Сообщений: 6312
Вместо ответа на вопрос демагогия пошла.
18 ноя 20, 23:38    [22235009]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
rgreat
Member

Откуда:
Сообщений: 6312
Если надо "кол-во полных часов между двумя датами":

Res:=Trunc(Abs(d1-d2)*24+0.0000000001);

P.S. При решении через DateTimeToMilliseconds стоит уменьшить зазор в часу менее чем 1 мсек получается прикол.
function HoursBetween(const ANow, AThen: TDateTime): Int64;
begin
  Result := Abs(DateTimeToMilliseconds(ANow) - DateTimeToMilliseconds(AThen))
    div (MSecsPerSec * SecsPerMin * MinsPerHour);
end;

begin
  var D1 := StrToDateTime('25.11.20 00:00');
  var D2 := StrToDateTime('24.11.20 23:00')+1/24/3600/10000;
  writeln(Trunc(Abs(D1-D2)*24+0.0000000001));
  writeln(HoursBetween(D1,D2));
end.

0
1

Мой подход и точнее и быстрей. Как-то так.

Сообщение было отредактировано: 19 ноя 20, 00:17
19 ноя 20, 00:13    [22235014]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
rgreat
Мой подход и точнее и быстрей. Как-то так.

С чего он точнее, если выдаёт час при интервале меньше часа?..

Тогда уж правильнее сделать функцию
function HoursBetween(...; AccuracyMSec: Double): Integer;
, где AccuracyMSec - точность определения интервала в миллисекундах.
19 ноя 20, 10:23    [22235122]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
defecator
Member

Откуда:
Сообщений: 39394
alekcvp
rgreat
Мой подход и точнее и быстрей. Как-то так.

С чего он точнее, если выдаёт час при интервале меньше часа?..

Тогда уж правильнее сделать функцию
function HoursBetween(...; AccuracyMSec: Double): Integer;

, где AccuracyMSec - точность определения интервала в миллисекундах.


тогда уж выдавать разницу в секундах, а не в часах.
а дальше пусть кому как надо округляют
19 ноя 20, 11:01    [22235150]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
defecator
тогда уж выдавать разницу в секундах, а не в часах.
а дальше пусть кому как надо округляют

999 мсек - это одна секунда или ноль?.. А 999.99?

Сообщение было отредактировано: 19 ноя 20, 11:32
19 ноя 20, 11:36    [22235185]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
defecator
Member

Откуда:
Сообщений: 39394
alekcvp
defecator
тогда уж выдавать разницу в секундах, а не в часах.
а дальше пусть кому как надо округляют

999 мсек - это одна секунда или ноль?.. А 999.99?


я написал - в секундах

defecator

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


Сообщение было отредактировано: 19 ноя 20, 11:53
19 ноя 20, 11:58    [22235205]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
rgreat
Member

Откуда:
Сообщений: 6312
alekcvp
rgreat
Мой подход и точнее и быстрей. Как-то так.

С чего он точнее, если выдаёт час при интервале меньше часа?.
Где?!
19 ноя 20, 12:27    [22235227]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
rgreat
alekcvp
пропущено...
С чего он точнее, если выдаёт час при интервале меньше часа?.
Где?!

Вот здесь:
  var D2 := StrToDateTime('24.11.20 23:00')+1/24/3600/10000;
19 ноя 20, 12:34    [22235235]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
defecator
alekcvp
пропущено...

999 мсек - это одна секунда или ноль?.. А 999.99?

я написал - в секундах
defecator

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

И? Разница в 999 мсек - это разница в одну секунду или в ноль секунд?
А почему именно в секундах, а не в миллисекундах?
А почему именно в одну, а не в 0.1?

Вообще весь вопрос в том - насколько точно может время определять компьютер и к этой точности привязаться при определении интервалов, с учётом погрешности округления Double.

Сообщение было отредактировано: 19 ноя 20, 12:31
19 ноя 20, 12:35    [22235236]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
rgreat
Member

Откуда:
Сообщений: 6312
alekcvp,

Где мой код выдает 1?
То что ты зацитировал это задание входных параметров.
При них мой код выдает 0.

Сообщение было отредактировано: 19 ноя 20, 12:46
19 ноя 20, 12:50    [22235248]     Ответить | Цитировать Сообщить модератору
 Re: Проблема округления даты (Double)  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
rgreat
alekcvp,

Где мой код выдает 1?
То что ты зацитировал это задание входных параметров.
При них мой код выдает 0.

Да, перепутал, извини :)
19 ноя 20, 13:01    [22235260]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить