Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / запутался с датами Borland C++ Builder / 5 сообщений из 5, страница 1 из 1
17.07.2006, 15:32
    #33858325
Масенок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запутался с датами Borland C++ Builder
запутался с датами 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
17.07.2006, 15:34
    #33858331
Масенок
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запутался с датами Borland C++ Builder
уточнение:


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


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


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