Почему при сравнении значений возвращается значение false, если значения совпадают? - PullRequest
0 голосов
/ 20 марта 2012

У меня есть Perl-скрипт, который загружает данные из файла Excel XLS в базу данных. Сначала он проверяет, существует ли дата-время значения из файла в базе данных. Если это так, он проверяет, совпадает ли значение из файла со значением в базе данных. Если они совпадают, значение пропускается. Если они различаются, значение в базе данных обновляется.

Код, который выполняет сравнение:

if($dbVal != $fileVal) {
  &UpdateData($id, $dt, $fileVal);
}

Проблема в том, что иногда, даже если два значения выглядят одинаково, сравнение решает, что это не так, и выполняется обновление sub. Ниже приведена выдержка из журнала отладки. Для каждого значения из файла он печатает значение в БД и значение файла. Если подпрограмма обновления выполняется, выдается строка «Updating ...»:

dbVal = '68800812'; file val = '68800812'
dbVal = '66649164'; file val = '66649164'
Updating:  41248 : 01/01/2011 07:00 : 66649164
dbVal = '64975681'; file val = '64975681'
dbVal = '64037179'; file val = '64037179'
dbVal = '64095165'; file val = '64095165'
dbVal = '64917078'; file val = '64917078'
dbVal = '66584188'; file val = '66584188'
Updating:  41248 : 01/01/2011 12:00 : 66584188

Таким образом, в приведенном выше фрагменте были два случая, когда db val и file val выглядели одинаково, но сабвуфер обновления был выполнен в любом случае, означая, что сравнение вернуло true, когда похоже, что оно должно было быть false.

Есть мысли / идеи?

Dave

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

Devel :: Peek показывает скалярный тип NV (число с плавающей запятой) вместо ожидаемого значения IV (целое число).sprintf показывает неточность, см. Почему я получаю длинные десятичные знаки (например, 19,9499999999999) вместо цифр, которые я должен получать (например, 19,95)? .Когда в строковом контексте просто печатается или используется иным образом, число приводится к представлению с 16-значной мантиссой (20–21, если используется экспоненциальная запись).и Math :: Round являются подходящими.

0 голосов
/ 20 марта 2012

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

Попробуйте это:

if($dbVal - $fileVal != 0) {
  &UpdateData($id, $dt, $fileVal);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...