0

嗨,我正在尝试对我的网络服务中的某些内容进行字符串匹配,但是我在比较双精度时遇到了困难

public List<Customers> GetCustomer(string anything)
{
    List<Customers> customers = customermembers.Where(n =>
    string.Equals(n.CustomerID, anything, StringComparison.CurrentCultureIgnoreCase)
    || string.Equals(n.FirstName, anything, StringComparison.CurrentCultureIgnoreCase)
    || string.Equals(n.LastName, anything, StringComparison.CurrentCultureIgnoreCase)
    || double.Equals(n.Age, anything, StringComparison.CurrentCultureIgnoreCase) //this like
    ).ToList();
    return customers;
}

你如何比较双标?

我的 DataContract 看起来像这样:

[DataMember(Name = "Age")]
public double Age { get; set; }
4

7 回答 7

1

像这样的东西

public bool DoubleEqualsString(double doubleValue, string stringValue)
{
    double convertedValue;
    if (Double.TryParse(stringValue, out convertedValue))
        return convertedValue == doubleValue;

    return false;
}
于 2012-07-24T23:26:58.617 回答
1

代替:

double double1 = Age;

string double1 = Age.ToString();

然后在您的比较中使用:

string.Equals(double1, anything, StringComparison.CurrentCultureIgnoreCase) 
于 2012-07-24T23:27:58.853 回答
1

你如何比较双标?

我假设您想比较两个代表年龄的双精度值,这anything确实不是 astring而是 a double(从问题中很难判断,因为使用的方式anything没有多大意义)。

您可以做的最好的事情是将Agefrom的类型切换double到(如果年龄是整数则decimal更好)。int这样做可以避免舍入错误。

但是,如果您想坚持使用浮点数,您可以double使用以下方法简单地比较两个值==

a == b

或使用静态object.Equals方法:

Equals(a, b)

如果您对年龄进行计算,您可能会遇到舍入问题,然后您将不得不使用一个小的epsilon值来表示您要使用的舍入精度:

const double Epsilon = 0.0000000001;
var areEqual = Math.Abs(a - b) < Epsilon;
于 2012-07-24T23:30:02.597 回答
0

在进行比较之前将 double 转换为 String。试试这个:将查询的最后一行替换为

|| String.Equals(SqlFunctions.StringConvert(n.Age), anything, StringComparison.CurrentCultureIgnoreCase) 
于 2012-07-24T23:26:55.963 回答
0

如何创建一个尝试将字符串解析为双精度并返回 -1 表示“不走运”的函数?

 public double ParseAge(string age){
      double parsedAge = -1;
      Double.TryParse(age, out parsedAge);
      return parsedAge;
 }

 public List<Customers> GetCustomer(string anything)
 {
    double double1 = Age;
    List<Customers> customers = customermembers.Where(n =>
                                       string.Equals(n.CustomerID, anything, StringComparison.CurrentCultureIgnoreCase)
                                       || string.Equals(n.FirstName, anything, StringComparison.CurrentCultureIgnoreCase)
                                       || string.Equals(n.LastName, anything, StringComparison.CurrentCultureIgnoreCase)
                                       || n.Age == ParseAge(anything) //this like
                                   ).ToList();
    return customers;
 }
于 2012-07-24T23:27:18.513 回答
0

请使用Double.TryParse方法将字符串转换为双精度,然后可以使用 == 运算符进行比较

于 2012-07-24T23:27:21.300 回答
0

在您使用它进行比较之前,我肯定会将字符串转换为双精度。

进一步 double.Equals 有点棘手,因为此方法会处理您的数字逗号后的确切位数,这意味着

double d1 = 0.33333d;
double d2 = 1/3;

bool result = double.Equals(d1, d2);

尽管您希望它们相等,但显然是错误的。

为避免此问题,我会将逗号后位数较多的双精度数修剪为逗号后位数较少的双精度数。

例如:

double d1 = 0.167832;
double d2 = 0.1564;

会融化成

double d1 = 0.1678
double d2 = 0.1564

现在您可以比较它们而不必担心。

于 2012-07-24T23:33:08.587 回答