diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-04-08 19:52:09 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-04-08 19:52:09 +0000 |
commit | ef4136b83f4ac033e7b38aaf4a2f2a9160d68135 (patch) | |
tree | fdeb1871d32b68991c7daefcacdf053f420bc1b2 /src/jvm/clojure/lang/Numbers.java | |
parent | 0da93ff9864827b21f9f2050e3826cda52b1fab0 (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.java | 20 |
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(); |