powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / запутался с датами Borland C++ Builder
5 сообщений из 5, страница 1 из 1
запутался с датами Borland C++ Builder
    #33858325
Масенок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
запутался с датами Borland C++ Builder

использую TDateTime (Borland C++ Builder)
работаю с датами, произвожу различные вычисления и т.п. под конец у меня начинают сказываться ошибки округления при сравнении.
Т.е., для примера

Код: plaintext
1.
2.
3.
TDateTime a, b;
    a = TDateTime(  2005 ,  6 ,  2  );
    b = TDateTime(  2005 ,  6 ,  2  );

с ними я делаю манипуляции, суть которых сводится к:
Код: plaintext
1.
    a = a + 1E- 9 ;

после этого оператор == класса TDateTime считает, что это разные величины, т.е. ( a == b ) == false;

Код: plaintext
1.
2.
3.
4.
    if ( a == b )
        sm( "ок" ); 
    else
        sm( "бе" ); 

но если выводить даты с точностью до миллисекунд, они получаются равными.
для данного случая:
выводит дату функция FormatDateTime( "yyyy-mm-dd hh:nn:ss:zzz", a_dt );
получается:
2005-06-02 00:00:00:000
38505,000000000000000000
2005-06-02 00:00:00:000
38505,000000000996800000
дата не изменилась, а значение изменилось.

может есть какая хитрость, что бы встроенный оператор == перестал учитывать эти погрешности и начал сравнивать только значимые части даты? Или я не врубился во что-то?
...
Рейтинг: 0 / 0
запутался с датами Borland C++ Builder
    #33858331
Масенок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уточнение:


до += 1E-9:

as TDateTime 2005-06-02 00:00:00:000
as double 38505,000000000000000000


после += 1E-9:

as TDateTime 2005-06-02 00:00:00:000
as double 38505,000000000996800000

дата не изменилась, а значение изменилось.
...
Рейтинг: 0 / 0
запутался с датами Borland C++ Builder
    #33858384
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если у вас С++ Builder, используйте CompareDateTime из DateUtils
...
Рейтинг: 0 / 0
запутался с датами Borland C++ Builder
    #33858387
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Масенокдата не изменилась, а значение изменилось
дело в способе хранения даты - это обычный double, целая часть которого - это дни, а дробная - часть суток.
double - весьма приблизительный тип данных, вот и неточности сравнения казалось бы одинаковых дат
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
запутался с датами Borland C++ Builder
    #33859288
Масенок
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, спасибо, разобрался!


a
2005-06-02 00:00:00:000
38505,000000000000000000
b
2005-06-02 00:00:00:000
38505,000000000000000000
c
2005-06-02 00:00:00:000
38505,000000000000000000
---------------------------------------------------------------------------

a +=1E-9
2005-06-02 00:00:00:000
38505,000000000996800000

b -=1E-9
2005-06-02 00:00:00:000
38504,999999999003200000

2005-06-02 00:00:00:000
38505,000000000000000000
---------------------------------------------------------------------------

сравнение с CompareDateTime нормально сравнивает. Странно, что они не реализовали это в самом TDateTime, вроде сам бог велел.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / запутался с датами Borland C++ Builder
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]