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. このクエリは、既存のデータ セットから 1 つの結果を返します。この結果は正しいですが、期待される完全なデータ セットではありません。

  2. オペランドを (より大きいからより小さいに) 反転すると、期待されたが検証されていない結果 (基本的には多数のデータ ポイント) が得られます。

  3. 最も奇妙なのは、より高い値 (for double i = 4.00;... など) で for ループ アウトを開始すると、以前よりも多くの結果が得られることです。

何が起こっているのかを明確にしたので、使用されているデータベースの構造/内容に関する関連情報を次に示します。

  1. すべてのテーブル データ型は、単純な INTEGER である RPM を除いて REAL に設定されます。

  2. tBL.AccelPedalPos > tSET.APPTransition の結果が true として返されることはありません (質問しないでください。現時点では問題ではありません。クエリから削除したため、役に立ちませんでした)。

  3. tSET.LoadTransition の値は、ログの初期の 1.1 を除いて、ほぼ常に 1 です。

  4. tBL.Calculated Load の値は 0.2 から 2 の間で変化し、比較対象となるフラットな 1.0 よりも大きい数百回の 10 進数値の反復があります。

おそらく、私が見逃しているのはとてつもなく単純なことですが、クエリを数十回書き直した後、私は壊れて、ここで助けを求めています.

また、私のコンピューターには「修正された」AMD TLB バグ プロセッサの 1 つが搭載されていることにも注意してください。ただし、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 に答える