public
Created

  • Download Gist
Rational.scala
Scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
class Rational(n: Int, d: Int) extends Ordered[Rational] {
require( d != 0 )
 
private val g = Rational.gcd(n.abs, d.abs)
val numer: Int = n/g * d.signum
val denom: Int = d.abs/g
 
def this(n: Int) = this(n, 1)
 
override def toString = numer + (if (denom == 1) "" else ("/"+denom))
 
// default methods
def +(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom )
def -(that: Rational): Rational = this + (-that)
def unary_- = new Rational( -numer, denom )
def abs = new Rational( numer.abs, denom )
def signum = new Rational( numer.signum )
 
def *(that: Rational): Rational = new Rational( this.numer * that.numer, this.denom * that.denom )
def /(that: Rational): Rational = this * that.inverse
def inverse = new Rational( denom, numer )
 
def compare(that: Rational) = this.numer * that.denom - that.numer * this.denom
def equals(that: Rational) = this.numer == that.numer && this.denom == that.denom
 
}
 
object Rational {
implicit def intToRational(x: Int) = new Rational(x)
private def gcd(a: Int, b: Int) : Int = if (b == 0) a else gcd(b, a % b)
 
def apply(numer: Int, denom: Int) = new Rational(numer, denom)
def apply(numer: Int) = new Rational(numer)
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.