正确的乘以长值的方法

时间:2016-04-05 13:05:03

标签: c#

我需要弄清楚哪两个分数大于另一个分数。分数结构保持分子和分母的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");
}

这适用于各种情况,但通过为ab选择其他数据类型,可以减少抛出异常的案例数量。

哪种数据类型是好的(最好没有额外的库可供参考)选择? decimalBigInteger

1 个答案:

答案 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。