我目前工作的下面的代碼: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)。
這個查詢就像它現在的數據集返回一個結果;此結果是正確的,但不是預期的完整數據集。
如果我翻轉操作數(從大於小於),我得到一個預期的但未經驗證的結果(基本上是很多數據點)。
最奇怪的是,如果我以更高的值啓動for循環(對於double i = 4.00; ...等),我會得到比以前更多的結果。
現在,我已經澄清所發生的事情,這裏是屬於結構上的相關信息/正在使用的數據庫的內容:
表數據類型的一切都是設置爲REAL,RPM只是一個簡單的INTEGER。
tBL.AccelPedalPos> tSET.APPTransition的結果永遠不會返回爲真(不要問,現在沒關係,是的,我已經將它從查詢中移除了),所以它不是一個因素
爲tSET.LoadTransition的值是幾乎總是1除了在日誌中早期它在哪裏1.1
爲tBL.Calculated負載的值0.2和2之間變化,以數百次的十進制值的迭代大於它應該比較的平坦1.0。
這可能是一些可笑的簡單,我很想念,但是在重新編寫查詢幾十次之後,我正在分手並尋求幫助。
也可能值得注意的是,我的電腦有一個「固定的」AMD TLB錯誤處理器;不過,我已經在運行Core 2 Duo的筆記本電腦上測試了應用程序的編譯版本,並得到了相同的結果。
任何輸入,將不勝感激。
我已經看到了,但基於直接輸入從i輸入到表中的值產生預期的整數。有點奇怪。 即使增量設置爲+ = .01,它爲什麼會這樣做? – Enki 2012-04-26 20:42:57
這裏有一篇像樣的文章:http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm - 浮點值意味着接近一個值,非常適合測量,但不是適合完全匹配。小數點浮動在2的冪上,而不是我們在十進制系統中使用的10。 – 2012-04-26 21:02:38
看起來像Math.Round(i,2).ToString()將是我現在的答案,直到我可以做到這一點「正確的方式」,無論可能。 謝謝! – Enki 2012-04-26 21:06:21