0

こんにちは、私のWebサービスで特定のものに対して文字列の一致を試みていますが、ダブルを比較するのに行き詰まります

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

ダブルをどのように比較しますか?

年齢を表す2つのdouble値を比較したいと思いますが、それはanything実際にはそうではありません(方法があまり意味をなさないため、質問から判断するのは少し難しいです)。stringdoubleanything

あなたができる最善のことは、タイプをAgeからdoubleに切り替えることです(または年齢が整数の場合はdecimalさらに良いです)。intそうすることで、丸め誤差を回避できます。

ただし、浮動小数点数に固執したい場合は、次をdouble使用して2つの値を単純に比較できます==

a == b

または静的object.Equalsメソッドを使用します。

Equals(a, b)

年齢で計算を実行すると、おそらく丸めの問題が発生し、使用する丸めの精度を表す小さなイプシロン値を使用する必要があります。

const double Epsilon = 0.0000000001;
var areEqual = Math.Abs(a - b) < Epsilon;
于 2012-07-24T23:30:02.597 に答える
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 に答える
0

比較に使用する前に、文字列を必ず double にキャストします。

さらに double.Equals は少しトリッキーです。このメソッドは、数字のカンマの後の正確な桁数を処理するためです。つまり、

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

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

あなたはそれらが等しいと期待していますが、明らかに偽になります。

この問題を回避するには、コンマの後の桁数が多い double をコンマの後の桁数が少ないものに切り詰めます。

例えば:

double d1 = 0.167832;
double d2 = 0.1564;

に溶けるだろう

double d1 = 0.1678
double d2 = 0.1564

これで、心配することなくそれらを比較できます。

于 2012-07-24T23:33:08.587 に答える
0

比較を行う前に double を String に変換します。これを試してください: クエリの最後の行を次のように置き換えます

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

文字列を double に解析し、「運が悪い」場合に -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メソッドを使用して文字列を double に変換してから、== 演算子を使用して比較してください。

于 2012-07-24T23:27:21.300 に答える