diff options
-rw-r--r-- | src/clj/clojure/core.clj | 1 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Ratio.java | 6 | ||||
-rw-r--r-- | test/clojure/test_clojure/numbers.clj | 3 |
3 files changed, 8 insertions, 2 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index ee3371fc..7e22d944 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -2426,6 +2426,7 @@ [x] (cond (instance? BigInteger x) x (decimal? x) (.toBigInteger #^BigDecimal x) + (ratio? x) (.bigIntegerValue #^clojure.lang.Ratio x) (number? x) (BigInteger/valueOf (long x)) :else (BigInteger. x))) diff --git a/src/jvm/clojure/lang/Ratio.java b/src/jvm/clojure/lang/Ratio.java index 6822cb36..6c7a9bb6 100644 --- a/src/jvm/clojure/lang/Ratio.java +++ b/src/jvm/clojure/lang/Ratio.java @@ -45,7 +45,7 @@ public int intValue(){ } public long longValue(){ - return (long) doubleValue(); + return bigIntegerValue().longValue(); } public float floatValue(){ @@ -67,6 +67,10 @@ public BigDecimal decimalValue(MathContext mc){ return numerator.divide(denominator, mc); } +public BigInteger bigIntegerValue(){ + return numerator.divide(denominator); +} + public int compareTo(Object o){ Number other = (Number)o; return Numbers.compare(this, other); diff --git a/test/clojure/test_clojure/numbers.clj b/test/clojure/test_clojure/numbers.clj index 78e0bdd7..82ba0ec2 100644 --- a/test/clojure/test_clojure/numbers.clj +++ b/test/clojure/test_clojure/numbers.clj @@ -439,4 +439,5 @@ Math/pow overflows to Infinity." (deftest test-ratios (is (= (denominator 1/2) 2)) - (is (= (numerator 1/2) 1))) + (is (= (numerator 1/2) 1)) + (is (= (bigint (/ 100000000000000000000 3)) 33333333333333333333))) |