1

我正在使用 DataView.RowFilter 过滤 DataView,我想比较舍入的双精度值而不是完整的双精度值。例如,Value 列中的值是具有很多精度的双精度值,而我要比较的值只有 2 个小数位。

dataView.RowFilter = "Value IN (1.76, 1.92, 2.44)"  

不起作用。我想做类似的事情:

dataView.RowFilter = "Round(Value, 2) IN (1.76, 1.92, 2.44)"  

但这不起作用(Round() 无法识别)

这甚至可以使用 RowFilter 吗?如果没有,关于我如何实现这一目标的任何想法?

4

2 回答 2

2

这可以通过使用数学技巧直接使用过滤器字符串来解决。

四舍五入到 2 dp 的数字可以与未四舍五入的数字进行比较,因为差异将在 0 的 .01 以内

即将1.23接近1.23456并接近1.229876,因此:

1.23 - 1.23456 < 0.01 AND
1.23 - 1.23456 > -0.01

1.23 - 1.229876 < 0.01 AND
1.23 - 1.229876 > -0.01

所以你的过滤器字符串应该是:

fieldName - value < 0.01 AND fieldName - value > -0.01
于 2012-11-02T05:29:30.797 回答
1

嘿,我也对此感兴趣,但我认为我发现这是不可能的(至少在当前的 ASP Net 功能集中)。我发现的最有用的 RowFilter 资源在这里:http ://www.csharp-examples.net/dataview-rowfilter/

在该站点中,最有用的花絮是您可以进行 SUM、COUNT、MIN、MAX、AVG(平均)、STDEV(统计标准差)和 VAR;以及 CONVERT、LEN、ISNULL、IIF、TRIM、SUBSTRING。

我对过滤器的问题是,当您的基础值为 1.23456 时,您只显示第一个 sig 数字(因此它会显示 1.23),然后尝试过滤值 = 1.23 没有结果的地方。理想情况下,ROUND 功能将允许我将行值四舍五入到我感兴趣的 sig-digs,但我也无法找到实现此目的的合理方法。

祝你好运,如果我偶然发现任何事情,我会告诉你的。

编辑:实际上,在我写完这篇文章之后,我想到了一种不那么笨拙的方法。一种可行且并不完全糟糕的方法是将两个值乘以 10^x,然后转换为整数。下面的示例代码:

int mult = Convert.ToInt32(Math.Pow(10.0, _defaultDecimalSignificantDigits)); //in your example 2
            dv.RowFilter = String.Format("CONVERT({0}*{3},System.Int32){1}CONVERT({2}*{3},System.Int32)", name, expression, value, mult); //where "name" is your column name, "expression" is =, <>, etc, and "value" is the entered row filter value

这些值不会在显示中相乘,而只会在过滤器逻辑中相乘。因此,如果您的分数是 14.998,则将您的过滤器乘以 1000(为您的过滤器和值提供 14,998 的值)。

这显然基于您要舍入的小数位数有限制,但在您的 2 舍入示例中,您只需将两者乘以 100。使用足够大的数字和/或足够的小数位四舍五入,您也可能溢出 Int32 边界,并且可能需要 Int64。

于 2010-02-15T22:55:43.030 回答