|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
Привет! Столкнулся с такой непоняткой - сравниваю результат вычитания одной переменной из другой на больше или равно 0 и хотя результат выражения=0 выражение не считается .Т. Вот выражение: Код: plaintext
Код: plaintext
на Код: plaintext
на Код: plaintext
на Код: plaintext
на Код: plaintext
и аж только в обертке в INT: Код: plaintext
Результат вычитания переменных типа DateTime, как я до сих пор думал, является целочисленным, в секундах. Но выходит что результат - какое-то нецелое число, а что-то типа Float/Double, однако 0 и в Африке 0, какая разница? Оно, что ли, миллисекунды добавляет где не просят и где они не указаны, (значит все равно =0) и все равно тогда не понятно в чем дело. Опять же сравнение на 0.00 не прошло... Может кто разъяснить в чем тут дело? вфп9сп1 спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 15:10 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
> Автор: CTAC-KO А что месье думает(знает) о Null? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 15:56 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
Пардон, мсье, но где же Вы хоть намек на .NULL. узрели? Все значения переменных при которых случается непонятка я в подробностях изложил. Ни одна из них не .NULL. иль мсье желает результат ISNULL() увидеть - могу лично для Вас устроить :) Или все это лишь тонкий намек? Извольте объясниться! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 22:32 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
HelpA DateTime value is stored in eight bytes — two four-byte integers. почему ж тогда разница вычитания не integer? Вот в чем вопрос! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 22:38 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
CTAC-KO, У меня (VFP9) все нормально : Код: plaintext 1. 2. 3. 4. 5.
Вызывает сомнение кажущееся (?) равенство m.ltNextStateBeg = m.ltPrevStateEnd. Если эти переменные являются результатом какого-то вычисления, то они могут и не равняться друг другу. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 22:49 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
самое интересное что повторить ситуацию искусственно не вышло. попробовал задать d1=datetime() d2=d1 ?d2-d1=0 выдало .T. я в осадке:лог из проги21:56:18 m.ltNextStateBeg=09.03.2010 08:30:00, m.ltPrevStateEnd=09.03.2010 08:30:00, m.tnAssignDuration=0 21:56:18 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.F. 21:56:18 m.ltNextStateBeg=09.03.2010 08:45:00, m.ltPrevStateEnd=09.03.2010 08:45:00, m.tnAssignDuration=0 21:56:18 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.T. 21:56:58 m.ltNextStateBeg=09.03.2010 08:30:00, m.ltPrevStateEnd=09.03.2010 08:30:00, m.tnAssignDuration=0 21:56:59 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.F. 21:56:59 m.ltNextStateBeg=09.03.2010 08:45:00, m.ltPrevStateEnd=09.03.2010 08:45:00, m.tnAssignDuration=0 21:56:59 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.T. 21:57:03 m.ltNextStateBeg=09.03.2010 08:30:00, m.ltPrevStateEnd=09.03.2010 08:30:00, m.tnAssignDuration=0 21:57:03 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.F. 21:57:03 m.ltNextStateBeg=09.03.2010 08:45:00, m.ltPrevStateEnd=09.03.2010 08:45:00, m.tnAssignDuration=0 21:57:03 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.T. 21:57:22 m.ltNextStateBeg=09.03.2010 08:30:00, m.ltPrevStateEnd=09.03.2010 08:30:00, m.tnAssignDuration=0 21:57:22 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.F. 21:57:22 m.ltNextStateBeg=09.03.2010 08:45:00, m.ltPrevStateEnd=09.03.2010 08:45:00, m.tnAssignDuration=0 21:57:22 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.T. 21:57:28 m.ltNextStateBeg=10.03.2010 08:30:00, m.ltPrevStateEnd=10.03.2010 08:30:00, m.tnAssignDuration=0 21:57:28 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.F. 21:57:28 m.ltNextStateBeg=10.03.2010 08:45:00, m.ltPrevStateEnd=10.03.2010 08:45:00, m.tnAssignDuration=0 21:57:28 m.ltNextStateBeg - m.ltPrevStateEnd >= m.tnAssignDuration=.T. ну чезанах?! как это вообще понимать, блин, что для 08:30 - .F., а для 08:45 - тут же радостно .T.?! Причем результат сравнения дат на равенство выдает .T. во всех случаях... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2010, 23:19 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
По всей вероятности дело в том, что одна из дат со временем 08:30 всегда является результатом вычисления (оно следующее: составляется переменная типа DateTime из двух - одна Date, а другая - DateTime, из первой берется дата, а из второй - время в виде строки и смешиваются через CTOT()), а вторая - берется из таблицы, а для 8:45 - оба значения - из таблицы, но! я добавил в лог результат их сравнения на равенство и фокс всегда выдает .Т., т.е. переменные равны, а значит их разница меж собой ОБЯЗАНА быть равной 0 или (с)"...а я сошла с ума - какая досада!" Причем реально как результат вычитания фокс выдает на экран 0, но при сравнении этого ноля с "обычным" - оказывается что это не одно и то же. Ну, допустим дело в том, что в дате скрыта часть в миллисекундах, которая явно не видна. Но все равно, я ее нигде явно не задаю, значит она, эта часть, всегда должна быть 0. Но даже если это не так, тогда переменные не должны быть равны между собой, но они-то равны! Или как тогда - при сравнении мы миллисекунды не учитываем, а вот при вычитании - учитываем, так что ли? Да и вообще: Help DATETIMEReturns the current date and time as a DateTime value, or creates a year 2000-compliant DateTime value. DATETIME([nYear, nMonth, nDay [, nHours [, nMinutes [, nSeconds]]]]) т.е. ни слова о каких-либо миллисекундах! И ведь я же не работаю с Numeric-переменными, у которых мб не видна полностью дробная часть, а с DateTime. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 00:27 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
CTAC-KO, Может быть, лучше сравнивать переменные после их преобразования ? Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 01:14 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
> Автор: CTAC-KO > Или все это лишь тонкий намек? Извольте объясниться! Я очень часто налетаю на то что полученные данные в курсоре, содержат Null, и при присвоении значения какой-то переменной сама переменная содержит ноль(глядя в отладчике). Но сравнение с нулём не дает истины, а проверка на IsNull() показывает где порылась собака. Вот и весь тонкий намек. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 10:41 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
CTAC-KOПривет! Столкнулся с такой непоняткой - сравниваю результат вычитания одной переменной из другой на больше или равно 0 и хотя результат выражения=0 выражение не считается .Т. Вот выражение: Код: plaintext
Что показывает DISPLAY MEMORY по этим переменным? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 11:20 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
Посмотрите обсуждение на по этой теме вот здесь: http://forum.foxclub.ru/read.php?29,404003,404222#msg-404222 может это ваша ситуация. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 12:06 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
Спасибо за ссылку, действительно там именно по моей ситуации обсуждение. Выход назван только один - это округление результатов вычислений с DateTime что я и сделал. Кому интересно суть примерно такая, как я и предполагал - хранение времени в миллисекундах, но 1 секунда при этом не всегда равна 1000мс, т.е. мб 998 или 999 - от чего и растут глюки... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2010, 23:10 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
вот, блин, идиотский фокс!!! ну ё-маё! завернулся в INT, так теперь сравнение для разницы равной 0 - работает, зато сравнение на, скажем, 900 секунд - нет, но на 900 сек. прекрасно работает без инта... я в шоке... придется писать собственные функции, работающие с DATETIME ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2010, 23:39 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
Во-первых, поскольку поля DateTime хранят данные с точностью до секунды, то это значит, что пытаться анализировать время именно с такой точностью - бессмысленно. Банальные правила математики: последняя цифра - недостоверна, предпоследняя - сомнительна. Ну, грубо говоря, надо всегда предполагать, что DateTime - это время +/- 0.5 секунды Во-вторых, поскольку FoxPro - это файл-сервер, то ВСЕ модификации данных выполняются на клиенте. Это значит, что если Вы записываете, например, текущее время Код: plaintext
то Вы записываете время локального компьютера, а вовсе не сервера, на котором храняться файлы DBF. Разумеется, на каждом компьютере время установлено по своему. Причем расхождение системных часов может достигать нескольких минут. Даже если у Вас установлена принудительная синхронизация времени в локальной сети, но ведь эта синхронизация выполняется периодически. Т.е. не гарантирует того, что время на всех компьютерах совпадает с точностью до секунды. Как следствие, сравнение надо выполнять с некоторыми допусками или в некотором диапазоне. Например Код: plaintext 1. 2. 3. 4.
Как и было написано по приведенной выше ссылке - сравнение действительных чисел по абсолютному значению - бессмысленная операция. Всегда нужен некий диапазон значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 11:08 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
CTAC-KOвот, блин, идиотский фокс!!! ну ё-маё! завернулся в INT, так теперь сравнение для разницы равной 0 - работает, зато сравнение на, скажем, 900 секунд - нет, но на 900 сек. прекрасно работает без инта... я в шоке... придется писать собственные функции, работающие с DATETIME А если попробовать округлять до наибольшего/наименьшего целого? Т.к. разница между полями типа datetime измеряются в секундах,то любую милисекунду(888.999) округлим до ближайшей наибольшей целой секунды,т.е. как только появилось хоть какое-то значение в дробной части-это сигнал о преобразовании к ближайшей наибольшей секунде. 0.001=1сек 888.999=889 сек Код: plaintext
0.001=0сек 888.999=888 сек Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 11:42 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
quxixCTAC-KOвот, блин, идиотский фокс!!! ну ё-маё! завернулся в INT, так теперь сравнение для разницы равной 0 - работает, зато сравнение на, скажем, 900 секунд - нет, но на 900 сек. прекрасно работает без инта... я в шоке... придется писать собственные функции, работающие с DATETIME А если попробовать округлять до наибольшего/наименьшего целого? Т.к. разница между полями типа datetime измеряются в секундах,то любую милисекунду(888.999) округлим до ближайшей наибольшей целой секунды,т.е. как только появилось хоть какое-то значение в дробной части-это сигнал о преобразовании к ближайшей наибольшей секунде. 0.001=1сек 888.999=889 сек Код: plaintext
0.001=0сек 888.999=888 сек Код: plaintext
И даже все-таки не буду категоричен. Вот тут сработало при округлении вверх Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Хотя и тут Fox опять живет по своим правилам Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 12:03 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
Я, короче, не стал играть в цейлинги и флоры :) написал вот такое: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
2 Владимир Максимов: Сначала я так и попытался сделать, только я пробовал m.tnAssignDuration/1,001, но не понравилось. Кроме того я не использую по своей задаче время с локального РС никогда вообще. В крайнем случае - запрашиваю с SQL-сервера, вернее даже не так - где надо, просто использую TIMESTAMP-поле. Но по задаче оно мне не нужно. Мне нужно распланировать день с интервалом в 15 минут в соотв. с рабочим графиком. Т.е. вариантов дельты нет изначально. Кроме того, меня в задаче изначально же секунды вообще не интересуют, уж не говоря про мс. Но, поскольку разница между ДТ вычисляется в секундах, то я просто свои минуты множил на 60. А тут сюрприз порылся :) Хотя, мб достаточно было бы просто использовать функцию Round() для округления до целого? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2010, 15:05 |
|
Почему сравнение на >=0 при выражении=0 считается .F.?
|
|||
---|---|---|---|
#18+
CTAC-KOМне нужно распланировать день с интервалом в 15 минут в соотв. с рабочим графиком. Т.е. вариантов дельты нет изначально. Кроме того, меня в задаче изначально же секунды вообще не интересуют, уж не говоря про мс. Но, поскольку разница между ДТ вычисляется в секундах, то я просто свои минуты множил на 60. А тут сюрприз порылся :) Хотя, мб достаточно было бы просто использовать функцию Round() для округления до целого? Так и надо было искать разницу в минутах . Тогда уж точно хватило бы Round() до целого после деления-то на 60. Никаких проблем не возникло бы... Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2010, 16:46 |
|
|
start [/forum/topic.php?fid=41&msg=36489790&tid=1585545]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 18ms |
total: | 179ms |
0 / 0 |