Rational constructor

Rational(
  1. BigInt numerator, [
  2. BigInt? denominator
])

Create a new rational number from its numerator and a non-zero denominator.

If the denominator is omitted then its value will be 1.

Implementation

factory Rational(BigInt numerator, [BigInt? denominator]) {
  if (denominator == null) return Rational._fromCanonicalForm(numerator, _i1);
  if (denominator == _i0) {
    throw ArgumentError('zero can not be used as denominator');
  }
  if (numerator == _i0) return Rational._fromCanonicalForm(_i0, _i1);
  if (denominator < _i0) {
    numerator = -numerator;
    denominator = -denominator;
  }
  // TODO(a14n): switch back when https://github.com/dart-lang/sdk/issues/46180 is fixed
  // final gcd = numerator.abs().gcd(denominator.abs());
  final gcd = _gcd(numerator.abs(), denominator.abs());
  return Rational._fromCanonicalForm(numerator ~/ gcd, denominator ~/ gcd);
}