Skip to content

Instantly share code, notes, and snippets.

@robherley
Created February 7, 2019 23:49
Show Gist options
  • Save robherley/a76818747c482ff22dc3f76be7859087 to your computer and use it in GitHub Desktop.
Save robherley/a76818747c482ff22dc3f76be7859087 to your computer and use it in GitHub Desktop.
class Fraction {
constructor(numerator, denominator) {
if (typeof numerator !== 'number' || typeof denominator !== 'number') {
throw 'Invalid Fraction (numerator and denominator must be numbers.';
}
if (denominator <= 0) {
throw 'Invalid Fraction (divide by Zero)';
}
const [_num, _denom] = Fraction.simplify(numerator, denominator);
this.numerator = _num;
this.denominator = _denom;
}
static gcd(n, d) {
return !d ? n : this.gcd(d, n % d);
}
static simplify(num, denom) {
const gcd = this.gcd(num, denom);
return [num / gcd, denom / gcd];
}
pretty() {
return `${this.numerator}/${this.denominator}`;
}
toNumber() {
return this.numerator / this.denominator;
}
safeOperand(_operand) {
if (_operand instanceof Fraction) {
return _operand;
} else {
const parsed = parseInt(_operand);
if (Number.isNaN(parsed)) {
throw 'Invalid operand.';
} else {
return new Fraction(parsed, 1);
}
}
}
add(_operand) {
const { numerator: n, denominator: d } = this.safeOperand(_operand);
this.numerator = this.numerator * d + n * this.denominator;
this.denominator *= d;
const [_num, _denom] = Fraction.simplify(
this.numerator,
this.denominator
);
this.numerator = _num;
this.denominator = _denom;
return this;
}
subtract(_operand) {
const { numerator: n, denominator: d } = this.safeOperand(_operand);
return this.add(new Fraction(-n, d));
}
multiply(_operand) {
const { numerator: n, denominator: d } = this.safeOperand(_operand);
this.numerator *= n;
this.denominator *= d;
const [_num, _denom] = Fraction.simplify(
this.numerator,
this.denominator
);
this.numerator = _num;
this.denominator = _denom;
return this;
}
divide(_operand) {
const { numerator: n, denominator: d } = this.safeOperand(_operand);
return this.multiply(new Fraction(d, n));
}
}
const test = new Fraction(100, 50);
test
.add(5)
.subtract(new Fraction(40, 10))
.divide('8');
console.log(test.pretty()); // 3/8
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment