我目前正在处理以下代码:
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&gt; tSET.LoadTransition)。
这个查询就是从我现有的数据集返回一个结果;此结果是正确的,但不是预期的完整数据集。
如果我翻转操作数(从大于小于),我得到一个预期但未经验证的结果(基本上是很多数据点)。
最奇怪的是,如果我以更高的值开始for循环(对于double i = 4.00; ...等),我得到的结果比以前更多。
现在我已经澄清了正在发生的事情,这里是有关正在使用的数据库的结构/内容的相关信息:
除了RPM之外,所有内容的表数据类型都设置为REAL,这只是一个普通的INTEGER。
tBL.AccelPedalPos的结果&gt; tSET.APPTransition将永远不会返回true(不要问,此时无关紧要,是的我已将其从查询中删除无效)因此它不是一个因素
tSET.LoadTransition的值几乎总是1,除了日志中早期的1.1
tBL.Calculated Load的值在.2和2之间变化,有数百次十进制值迭代,大于它应该比较的平面1.0。
我可能遗漏了一些非常简单的事情,但在重新编写查询几十次之后,我在这里打破并寻求帮助。
值得注意的是,我的计算机有一个“固定的”AMD TLB错误处理器;但是,我已经在运行Core 2 Duo的笔记本电脑上测试了该应用程序的编译版本,结果相同。
任何意见都会受到赞赏。
答案 0 :(得分:1)
浮点值的行为与整数值不同;从0.00到5的循环永远不会为i产生4.0
的值。
您可能想要指定MAFVoltage的范围(&gt; last_value_of_i AND&lt; = current_value_of_i)或使用decimal
来获得类似整数的精度。
要验证我正在讨论的问题是您的情况,请首次记录CommandText
属性i
大于4 - 它应报告类似{{1 }}