有点晕了,毕业这么久,才后悔当初应该学计算机专业的;也后悔没专业的学习过就进入这个行业。有些基础性的东西,还是差远了。
在前一篇文章中,我说到了Lucene.Net的搜索结果排序问题。当时,我的想法是将DateTime 转换成float 去进行排序;初一看似乎没什么问题,想法也很好。可是最近测试人员老是报告说:排序很乱,不是按照他们的时间来排的。我就奇怪了。
仔细检查,原来是float的精度问题造成的,float精度 7位。具个例子:
float
f1
=
20080421153700
;
float f2 = 20080421094827 ;
if (f1 > f2)
... {
MessageBox.Show("正确");
}
else if (f1 == f2)
... {
MessageBox.Show("相等");
}
else
... {
MessageBox.Show("错误");
}
float f2 = 20080421094827 ;
if (f1 > f2)
... {
MessageBox.Show("正确");
}
else if (f1 == f2)
... {
MessageBox.Show("相等");
}
else
... {
MessageBox.Show("错误");
}
上面这段代码,输出结果是什么呢? 我们一看,很显然f1 要比f2大,我们希望的结果是“正确”,可是输出的结果却是“相等”,为什么?由于float的精度是7位,它们比较的从高到低的前七位,f1 和 f2 的前7位都是"2008042",结果就相等了。
郁闷了,这样,我们的结果排序就有问题了。转换成int又会溢出。难道没有解决办法了吗?
我们还是从DateTime 和 int 类型来入手。
/**/
/// <summary>
/// 将时间转换成一个Int类型的数字
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
private int ConvertDateTimeToInt(DateTime dt) ... {
TimeSpan ts=dt.Subtract(DateTime.MinValue);
return (int)ts.TotalMinutes;
}
/// 将时间转换成一个Int类型的数字
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
private int ConvertDateTimeToInt(DateTime dt) ... {
TimeSpan ts=dt.Subtract(DateTime.MinValue);
return (int)ts.TotalMinutes;
}
由于直接将时间转换成int会溢出,因此我们在每个时间的基础上都减去一个基数(DateTime.MinValue);这个基数可以根据自己的时间情况去设置。比如我们也可设置成2008-01-01 00:00:01
这样转换以后,我们的时间实际是精确到“分”,这基本满足我们的要求了。如果我们希望精确到“秒”,那么我们只需要将这个基数设置大一些,也就是离我们进一些的时间。
最后排序时:
Sort sort
=
new
Sort(
new
SortField(
"
Time
"
,
4
,
true
));
我们的排序问题,就解决了。