Decimal.fraction constructor
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);
}