0

我目前正在处理以下代码:

    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 Load 的值在 0.2 和 2 之间变化,有数百次迭代的十进制值大于它应该与之比较的平坦 1.0。

我想念的东西可能非常简单,但是在重写了几十次查询之后,我崩溃了,在这里寻求帮助。

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

任何输入将不胜感激。

4

1 回答 1

1

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

您可能想要指定 MAFVoltage 的范围 (> last_value_of_i AND <= current_value_of_i) 或decimal用于类似整数的精度。

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

于 2012-04-26T20:40:19.610 回答