Всем добрый день. Как корректнее и надежнее сравнивать даты на Lua, как числа или как строки? Пример: Получаем две даты:
os_date = os.date ("%Y%m%d") -- текущая дата операционной системы (ОС)
local t = getCandlesByIndex (CHART_TAG_PRICE, 0, number - INT_QUANTITY, INT_QUANTITY) -- получение таблицы свечей заданного периода local date_candle = dateCandle (t[j].datetime.year, t[j].datetime.month, t[j].datetime.day) -- получение даты свечи
function dateCandle (year, month, day) -- функция формирования даты свечи (number) local candle_date = 10000 * year + 100 * month + day return candle_date end
При сравнении: if date_candle == os_date then, переводить date_candle в string (изначально формировать в string) или os_date переводить в number?
Еще раз поясню попроще. Есть две даты, которые изображены цифрами, а не словами. Например: 20190422. Эти даты можно преобразовать в string или number и сравнивать оператором "==". То есть string == string и number == number ("20190422" == "20190422" и 20190422 == 20190422) Работают оба варианта. Какой из этих двух вариантов правильнее, корректнее, надежнее?
пс Вопрос, конечно, не сильно критичный, но я подумал, что мало ли кто разбирался и знает.
Sergey Gorokhov написал: Игорь М, При сравнении даты и времени, самый правильный и надежный способ, перевести дату в число дней (для времени секунд) и далее уже сравнивать.
А что это меняет и как таки их корректно сравнивать? Можно от дат и времени абстрагироваться, это был просто пример из практики. Как правильнее и надежнее в Lua сравнивать оператором "==" переменные, которые могут быть и string и number? Переводить обе (или одну из них) в string и затем сравнивать строки или переводить в number и сравнивать числа? Я склоняюсь на сравнение чисел, но для меня это не очевидно, поэтому и спрашивал.
- любые конверсии из типа в тип стоят немало, замерьте ваш случай численно. - строки в принципе неприятная штука, лучше обходиться массивом символов по возможности.
новичок написал: - любые конверсии из типа в тип стоят немало, замерьте ваш случай численно. - строки в принципе неприятная штука, лучше обходиться массивом символов по возможности.
В моем случае лишние конверсии не являются критичными, да и когда нужно сравнить две переменные разных типов одну из них в любом случае придется переводить в тип второй. Поэтому я и озадачился выбором в какой тип предпочтительнее переводить для сравнения. В общем-то вопрос более теоретический, чем прикладной, так как потенциальных косяков в программе и окружении на порядок больше, чем эта мелочь.
Строки сравниваются в лексикографическом порядке, т.е. посимвольно слева направо. Так как "0" < "1" < ... < "9", то при использовании строкового формата даты "YYYYMMDD" сравнение будет корректным. Вывод: в данном случае использование как числового, так и символьного представления будет работать одинаково правильно. Такая теория интересовала?
SDL написал: Строки сравниваются в лексикографическом порядке, т.е. посимвольно слева направо. Так как "0" < "1" < ... < "9", то при использовании строкового формата даты "YYYYMMDD" сравнение будет корректным. Вывод: в данном случае использование как числового, так и символьного представления будет работать одинаково правильно. Такая теория интересовала?
В общем меня интересовал вопрос: для какого из двух сравнений string == string и number == number вероятность потенциальной ошибки результата сравнения выше и почему? Я склоняюсь к сравнению числовых представлений, потому что такой вот скрипт:
Целые числа в формате Lua "number" (он же C "double"), равно как и результаты операций +/- с ними, согласно особенностям IEEE 754, представляются точно. Поэтому просто не надо допускать невязок округления, и с целыми числами можно работать спокойно. А если невязки неизбежны, делать round().
SDL написал: Целые числа в формате Lua "number" (он же C "double"), равно как и результаты операций +/- с ними, согласно особенностям IEEE 754, представляются точно. Поэтому просто не надо допускать невязок округления, и с целыми числами можно работать спокойно. А если невязки неизбежны, делать round().
Это понятно, я с вами согласен. Резюмируя: универсального выбора, в каком виде лучше сравнивать, судя по всему нет. Я думал, что строковое сравнение должно быть всегда надежнее, но, оказалось, что не всегда.
Если сравнивать в лоб без преобразований с округлениями, разделениями строк и т.п., то значения переменных вида: 20190425.00000001 == 20190425 надежнее сравнивать в числах, а значения переменных вида: 201904251234567.1 == 201904251234567 - в строках. При этом сравнение 20190425123456.01 == 20190425123456 лучше опять делать в числах, а 20190425123456.001 == 20190425123456 лучше, вообще, не сравнивать - неправильный результат в обоих случаях.