我需要弄清楚哪两个分数大于另一个分数。分数结构保持分子和分母的long
值。
天真的方法如下:
try
{
checked
{
long a = fraction1.Numerator * fraction2.Denominator;
long b = fraction2.Numerator * fraction1.Denominator;
return a.CompareTo(b);
}
}
catch
{
throw new Exception("CompareTo failed");
}
这适用于各种情况,但通过为a
和b
选择其他数据类型,可以减少抛出异常的案例数量。
哪种数据类型是好的(最好没有额外的库可供参考)选择? decimal
? BigInteger
?
答案 0 :(得分:0)
我通过尝试执行十进制乘法来解决了这个问题。并且只有(出于性能原因)如果失败我会进行BigInteger乘法。找到共同因素当然是事先做好的。
try
{
decimal a = (decimal)fraction1.Numerator * (decimal)fraction2.Denominator;
decimal b = (decimal)fraction2.Numerator * (decimal)fraction1.Denominator;
return a.CompareTo(b);
}
catch
{
BigInteger a = new BigInteger(fraction1.Numerator) * new BigInteger(fraction2.Denominator);
BigInteger b = new BigInteger(fraction2.Numerator) * new (fraction1.Denominator);
return a.CompareTo(b);
}
附注:在这种情况下,从System.Numerics引用BigInteger对我来说是可以接受的,因为它带有.Net 4。