summaryrefslogtreecommitdiff
path: root/src/jvm/clojure/lang/Numbers.java
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-04-08 19:52:09 +0000
committerRich Hickey <richhickey@gmail.com>2008-04-08 19:52:09 +0000
commitef4136b83f4ac033e7b38aaf4a2f2a9160d68135 (patch)
treefdeb1871d32b68991c7daefcacdf053f420bc1b2 /src/jvm/clojure/lang/Numbers.java
parent0da93ff9864827b21f9f2050e3826cda52b1fab0 (diff)
added rationalize, fixed toRatio, added BigInteger and BigDecimal to auto-imports
Diffstat (limited to 'src/jvm/clojure/lang/Numbers.java')
-rw-r--r--src/jvm/clojure/lang/Numbers.java20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java
index 9ae8e06c..91dcefe9 100644
--- a/src/jvm/clojure/lang/Numbers.java
+++ b/src/jvm/clojure/lang/Numbers.java
@@ -182,13 +182,29 @@ static Ratio toRatio(Object x){
BigInteger bv = bx.unscaledValue();
int scale = bx.scale();
if(scale < 0)
- return new Ratio(bv, BigInteger.TEN.pow(-scale));
+ return new Ratio(bv.multiply(BigInteger.TEN.pow(-scale)),BigInteger.ONE);
else
- return new Ratio(bv.multiply(BigInteger.TEN.pow(scale)), BigInteger.ONE);
+ return new Ratio(bv,BigInteger.TEN.pow(scale));
}
return new Ratio(toBigInteger(x), BigInteger.ONE);
}
+static public Number rationalize(Number x){
+ if(x instanceof Float || x instanceof Double)
+ return rationalize(BigDecimal.valueOf(x.doubleValue()));
+ else if(x instanceof BigDecimal)
+ {
+ BigDecimal bx = (BigDecimal) x;
+ BigInteger bv = bx.unscaledValue();
+ int scale = bx.scale();
+ if(scale < 0)
+ return bv.multiply(BigInteger.TEN.pow(-scale));
+ else
+ return divide(bv, BigInteger.TEN.pow(scale));
+ }
+ return x;
+}
+
static public Number reduce(BigInteger val){
if(val.bitLength() < 32)
return val.intValue();