package com.googlecode.totallylazy.numbers;
/*
This code is a a modified version of Ratio from Rich Hickeys clojure core
*/
/**
* Copyright (c) Rich Hickey. All rights reserved.
* The use and distribution terms for this software are covered by the
* Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
* which can be found in the file epl-v10.html at the root of this distribution.
* By using this software in any fashion, you are agreeing to be bound by
* the terms of this license.
* You must not remove this notice, or any other, from this software.
**/
/* rich Mar 31, 2008 */
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
public final class Ratio extends Number implements Comparable<Number> {
private static final long serialVersionUID = -3334897190745766939L;
final public BigInteger numerator;
final public BigInteger denominator;
public Ratio(BigInteger numerator, BigInteger denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public final boolean equals(Object arg0) {
return arg0 instanceof Ratio
&& ((Ratio) arg0).numerator.equals(numerator)
&& ((Ratio) arg0).denominator.equals(denominator);
}
public final int hashCode() {
return numerator.hashCode() ^ denominator.hashCode();
}
public final String toString() {
return numerator.toString() + "/" + denominator.toString();
}
public final int intValue() {
return (int) doubleValue();
}
public final long longValue() {
return bigIntegerValue().longValue();
}
public final float floatValue() {
return (float) doubleValue();
}
public final double doubleValue() {
return decimalValue(MathContext.DECIMAL64).doubleValue();
}
public final BigDecimal decimalValue() {
return decimalValue(MathContext.UNLIMITED);
}
public final BigDecimal decimalValue(MathContext mc) {
BigDecimal numerator = new BigDecimal(this.numerator);
BigDecimal denominator = new BigDecimal(this.denominator);
return numerator.divide(denominator, mc);
}
public final BigInteger bigIntegerValue() {
return numerator.divide(denominator);
}
public final int compareTo(Number other) {
return Numbers.compare(this, other);
}
}