diff options
author | Alex Osborne <ato@meshy.org> | 2010-04-07 20:09:42 +1000 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-04-20 22:07:15 -0400 |
commit | 8e916164ca3a57e5ce924ed153fe435356f8d4a0 (patch) | |
tree | e086818fe2a44097ee4806aadeea559419402c93 | |
parent | 640b3cdf1012e08e1a9f6225911aab2776cfe846 (diff) |
Don't truncate large ratios when converting to bigint. Fixes #290.
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-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))) |