2012-03-24 14 views
-1

> =法の比較と間違って何かがあります:フラクション比較の問題は

public static bool operator >=(Fraction left, Fraction right) 
    { 
     return left.CompareTo(right) >= 0; 
    } 

動作していないように!例えば

25> = 6/5戻りFALSE

誰もこれにいくつかの光を当てることができますか?

以下は要求されたコードです。誰かが間違っていることを見つけられることを願っています。

/// <summary> 
    /// Compares an object to this Fraction 
    /// </summary> 
    /// <param name="obj">The object to compare against (null is less than everything)</param> 
    /// <returns>-1 if this is less than <paramref name="obj"></paramref>, 
    /// 0 if they are equal, 
    /// 1 if this is greater than <paramref name="obj"></paramref></returns> 
    /// <remarks>Will convert an object from longs, doubles, and strings as this is a value-type.</remarks> 
    public int CompareTo(object obj) 
    { 
     if (obj == null) 
      return 1; // null is less than anything 

     Fraction right; 

     if (obj is Fraction) 
      right = (Fraction)obj; 
     else if (obj is long) 
      right = (long)obj; 
     else if (obj is double) 
      right = (double)obj; 
     else if (obj is string) 
      right = (string)obj; 
     else 
      throw new ArgumentException("Must be convertible to Fraction", "obj"); 

     return this.CompareTo(right); 
    } 

    /// <summary> 
    /// Compares this Fraction to another Fraction 
    /// </summary> 
    /// <param name="right">The Fraction to compare against</param> 
    /// <returns>-1 if this is less than <paramref name="right"></paramref>, 
    /// 0 if they are equal, 
    /// 1 if this is greater than <paramref name="right"></paramref></returns> 
    public int CompareTo(Fraction right) 
    { 
     // if left is an indeterminate, punt to the helper... 
     if (this.m_Denominator == 0) 
     { 
      return IndeterminantCompare(NormalizeIndeterminate(this.m_Numerator), right); 
     } 

     // if right is an indeterminate, punt to the helper... 
     if (right.m_Denominator == 0) 
     { 
      // note sign-flip... 
      return -IndeterminantCompare(NormalizeIndeterminate(right.m_Numerator), this); 
     } 

     // they're both normal Fractions 
     CrossReducePair(ref this, ref right); 

     try 
     { 
      checked 
      { 
       long leftScale = this.m_Numerator * right.m_Denominator; 
       long rightScale = this.m_Denominator * right.m_Numerator; 

       if (leftScale < rightScale) 
        return -1; 
       else if (leftScale > rightScale) 
        return 1; 
       else 
        return 0; 
      } 
     } 
     catch (Exception e) 
     { 
      throw new FractionException(string.Format("CompareTo({0}, {1}) error", this, right), e); 
     } 
    } 


    /// <summary> 
    /// Cross-reduces a pair of Fractions so that we have the best GCD-reduced values for multiplication 
    /// </summary> 
    /// <param name="frac1">The first Fraction [WILL BE MODIFIED IN PLACE]</param> 
    /// <param name="frac2">The second Fraction [WILL BE MODIFIED IN PLACE]</param> 
    /// <remarks>Modifies the input arguments in-place!</remarks> 
    /// <example>(3/4, 5/9) = (1/4, 5/3)</example> 
    public static void CrossReducePair(ref Fraction frac1, ref Fraction frac2) 
    { 
     // leave the indeterminates alone! 
     if (frac1.m_Denominator == 0 || frac2.m_Denominator == 0) 
      return; 

     long gcdTop = GCD(frac1.m_Numerator, frac2.m_Denominator); 
     frac1.m_Numerator = frac1.m_Numerator/gcdTop; 
     frac2.m_Denominator = frac2.m_Denominator/gcdTop; 

     long gcdBottom = GCD(frac1.m_Denominator, frac2.m_Numerator); 
     frac2.m_Numerator = frac2.m_Numerator/gcdBottom; 
     frac1.m_Denominator = frac1.m_Denominator/gcdBottom; 
    } 
+1

あなたの 'CompareTo'メソッドを表示してください... –

+1

あなたのFractionクラス、特にCompareToを参照する必要があります – BlackBear

+0

' Fraction'クラスのコードを表示できますか? – Ryan

答えて

2

CrossReducePairの方法はあまり意味がないようです。コメントに記載されているとおり、(3/4, 5/9)(1/4, 5/3)に変換されます。注:3/4 > 5/9が、1/4 < 5/3です。

また、オブジェクトを変更する方法をCompareToに設定することは非常に悪い考えです。

5

CrossReducePairは数値間の関係を変更します。あなたの(3/4、5/9)=(1/4、5/3)の例は非常に明白です。クロスリダクションは、乗算している場合は意味がありますが、単に比較している場合は意味がありません。