2012-03-20 125 views
0

我有一個perl腳本,可以將Excel XLS文件中的數據加載到數據庫中。首先,它檢查數據庫中是否存在來自文件的值的日期時間。如果確實如此,它會檢查文件中的值是否與數據庫中的值相同。如果它們相同,則跳過該值。如果它們不同,數據庫中的值會更新。爲什麼當值相同時,我的值比較返回false?

,做比較的代碼是:

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

的問題是,有時,即使兩個值「看」相同,比較確定他們不是並執行更新子。以下是調試日誌的摘錄。對於文件中的每個值,它都會輸出db值和文件值。如果更新子被執行,「更新......」兩行文字:

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 

所以在上面的片段中,有兩個實例,其中分貝VAL和文件VAL看起來是一樣的,但更新子無論如何都被執行了,這意味着當它看起來應該是錯誤的時候,比較返回true。

有什麼想法/想法?

戴夫

+3

查看'Devel :: Peek :: Dump'和'sprintf'%.100f''的值。 – daxim 2012-03-20 15:50:40

+0

使用'printf'查看值顯示出不同。看起來像「66649164」的值實際上是文件中的「66649164.000000007450580596923828125」。 >:\ 添加此作爲答案,我會接受它。 – DaveKub 2012-03-20 18:01:32

回答

3

傑韋利::皮克揭示了標量類型NV(浮動)而不是預期IV(整數)。 sprintf顯示不精確,見Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?。當在字符串上下文中簡單地打印或使用其他字符時,該數字被強制轉換爲具有16位尾數的表示(如果使用指數表示,則爲20-21)。

在進行比較之前明確地舍入數字,sprintfMath::Round是合適的。

0

也許你的價值觀被當作字符串和一個FO兩個必須在開始/結束的額外空間。

嘗試這種情況:

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

你沒有測試這個理論,是嗎?將字符串轉換爲數字時,Perl將忽略空格。 – TLP 2012-03-20 16:51:47

+0

另外,當我將值打印到調試日誌時,我用單引號括住變量名稱以顯示任何前導/尾隨空格。這是我幾年前的習慣。 – DaveKub 2012-03-20 17:19:12

相關問題