【问题标题】:SQLite WHERE clause comparison fails to return expected result setSQLite WHERE 子句比较无法返回预期的结果集
【发布时间】:2012-04-27 04:40:19
【问题描述】:

我目前正在编写以下代码:

    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. tB​​L.AccelPedalPos > tSET.APPTransition 的结果将永远不会返回为真(不要问,此时没关系,是的,我已将其从查询中删除,但无济于事)所以这不是一个因素

  3. tSET.LoadTransition 的值几乎总是 1,除了在日志的早期它是 1.1

  4. tB​​L.Calculated Load 的值在 0.2 和 2 之间变化,有数百次迭代的十进制值大于应该与之比较的平坦 1.0。

我可能遗漏了一些简单得可笑的东西,但是在重写了几十次查询之后,我崩溃了,在这里寻求帮助。

还可能值得注意的是,我的计算机具有“已修复”的 AMD TLB 错误处理器之一;但是,我已经在运行 Core 2 Duo 的笔记本电脑上测试了该应用程序的编译版本,结果完全相同。

我们将不胜感激。

【问题讨论】:

    标签: c# sqlite compare where-clause


    【解决方案1】:

    浮点值的行为与整数值不同;从 0.00 到 5 的循环永远不会为 i 产生 4.0 的值。

    您可能希望指定 MAFVoltage 的范围 (> last_value_of_i AND decimal 以获得类似整数的精度。

    要验证我正在谈论的问题是在您的情况下发生的情况,请首次记录 CommandText 属性 i 大于 4 - 它应该报告类似 WHERE MAFVoltage = 4.0099999999999589 的内容。

    【讨论】:

    • 我已经看到了,但是根据 i 的直接输入输入到表中的值会产生预期的整数。有点奇怪。为什么即使增量设置为 += .01 也会这样做?
    • 这里有一篇不错的文章:effbot.org/pyfaq/… - 浮点值用于近似值,非常适合测量,但不适合精确匹配。小数点以 2 的幂浮动,而不是我们在十进制系统中习惯的 10。
    • 看起来 Math.Round(i, 2).ToString() 将是我现在的答案,直到我能以“正确的方式”做到这一点,不管那是什么。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2021-09-29
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多