summaryrefslogtreecommitdiff
path: root/src/jvm
diff options
context:
space:
mode:
Diffstat (limited to 'src/jvm')
-rw-r--r--src/jvm/clojure/lang/Numbers.java20
-rw-r--r--src/jvm/clojure/lang/RT.java5
2 files changed, 22 insertions, 3 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();
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index 4d3b60dd..ed4de6b7 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -19,6 +19,7 @@ import java.util.regex.Matcher;
import java.io.*;
import java.lang.reflect.Array;
import java.math.BigDecimal;
+import java.math.BigInteger;
public class RT{
@@ -82,7 +83,9 @@ Symbol.create("Iterable"), Iterable.class,
Symbol.create("Readable"), Readable.class,
Symbol.create("Runnable"), Runnable.class,
Symbol.create("Callable"), Callable.class,
-Symbol.create("Exception"), Exception.class
+Symbol.create("Exception"), Exception.class,
+Symbol.create("BigInteger"), BigInteger.class,
+Symbol.create("BigDecimal"), BigDecimal.class
// Symbol.create("Collection"), "java.util.Collection",
// Symbol.create("Comparator"), "java.util.Comparator",
// Symbol.create("Enumeration"), "java.util.Enumeration",