Decimal.fraction constructor

Decimal.fraction(
  1. BigInt numerator,
  2. BigInt denominator
)

Implementation

factory Decimal.fraction(BigInt numerator, BigInt denominator) {
  var (gcdNumerator, gcdDenominator) = gcd(numerator, denominator);
  // Judge the denominator only contains factors of 2 and 5
  BigInt temDenominator = gcdDenominator;
  int scale = 0;
  int tempScale = 0;
  while (temDenominator % _bi2 == BigInt.zero) {
    temDenominator = temDenominator ~/ _bi2;
    tempScale += 1;
  }
  scale = max(scale, tempScale);
  while (temDenominator % _bi5 == BigInt.zero) {
    temDenominator = temDenominator ~/ _bi5;
    tempScale += 1;
  }
  scale = max(scale, tempScale);

  if (temDenominator == BigInt.one) {
    // Not infinite decimal
    final decimalNumerator = gcdNumerator * pow10(scale);
    final decimalDenominator = gcdDenominator;
    if (decimalNumerator % decimalDenominator != BigInt.zero) {
      throw ArgumentError('Unexpected error');
    }

    return Decimal(decimalNumerator ~/ decimalDenominator, scale);
  }

  return Rational.fraction(gcdNumerator, gcdDenominator, reduce: false);
}