2012-04-26 36 views
0

我目前工作的下面的代碼:SQLite的WHERE子句比較失敗返回預期的結果集

for (double i = 0.00; i < 5; i += 0.01) 
     { 
      cmd.CommandText = "SELECT " + 
      "COUNT(DISTINCT(ActualAFR)) " + 
      "FROM tblBaseLog AS tBL " + 
      "INNER JOIN tblSettings AS tSET " + 
      "ON tBL.RPM = tSET.RPM " + 
      "WHERE MAFVoltage = " + i + " AND " + 
      "(tBL.AccelPedalPos > tSET.APPTransition OR " + 
      "tBL.CalculatedLoad > tSET.LoadTransition)"; 

      int trimCount = Convert.ToInt32(cmd.ExecuteScalar().ToString()); 

我遇到的問題是特定於查詢的最後一行的WHERE子句比較(特別是tBL.CalculatedLoad> tSET.LoadTransition)。

  1. 這個查詢就像它現在的數據集返回一個結果;此結果是正確的,但不是預期的完整數據集。

  2. 如果我翻轉操作數(從大於小於),我得到一個預期的但未經驗證的結果(基本上是很多數據點)。

  3. 最奇怪的是,如果我以更高的值啓動for循環(對於double i = 4.00; ...等),我會得到比以前更多的結果。

現在,我已經澄清所發生的事情,這裏是屬於結構上的相關信息/正在使用的數據庫的內容:

  1. 表數據類型的一切都是設置爲REAL,RPM只是一個簡單的INTEGER。

  2. tBL.AccelPedalPos> tSET.APPTransition的結果永遠不會返回爲真(不要問,現在沒關係,是的,我已經將它從查詢中移除了),所以它不是一個因素

  3. 爲tSET.LoadTransition的值是幾乎總是1除了在日誌中早期它在哪裏1.1

  4. 爲tBL.Calculated負載的值0.2和2之間變化,以數百次的十進制值的迭代大於它應該比較的平坦1.0。

這可能是一些可笑的簡單,我很想念,但是在重新編寫查詢幾十次之後,我正在分手並尋求幫助。

也可能值得注意的是,我的電腦有一個「固定的」AMD TLB錯誤處理器;不過,我已經在運行Core 2 Duo的筆記本電腦上測試了應用程序的編譯版本,並得到了相同的結果。

任何輸入,將不勝感激。

回答

1

浮點值的行爲與整數值的行爲不同;從0.00到5的循環將永遠不會爲我產生值4.0

您可能希望爲MAFVoltage指定一個範圍(> last_value_of_i AND < = current_value_of_i)或使用decimal獲得類似整數的準確度。

要驗證我所說的問題是在您的案例中發生了什麼,請首先記錄CommandText屬性i大於4--它應報告類似WHERE MAFVoltage = 4.0099999999999589的內容。

+0

我已經看到了,但基於直接輸入從i輸入到表中的值產生預期的整數。有點奇怪。 即使增量設置爲+ = .01,它爲什麼會這樣做? – Enki 2012-04-26 20:42:57

+0

這裏有一篇像樣的文章:http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm - 浮點值意味着接近一個值,非常適合測量,但不是適合完全匹配。小數點浮動在2的冪上,而不是我們在十進制系統中使用的10。 – 2012-04-26 21:02:38

+0

看起來像Math.Round(i,2).ToString()將是我現在的答案,直到我可以做到這一點「正確的方式」,無論可能。 謝謝! – Enki 2012-04-26 21:06:21