Created
February 7, 2019 23:49
-
-
Save robherley/a76818747c482ff22dc3f76be7859087 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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