summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Osborne <ato@meshy.org>2010-04-07 20:09:42 +1000
committerStuart Halloway <stu@thinkrelevance.com>2010-04-20 22:07:15 -0400
commit8e916164ca3a57e5ce924ed153fe435356f8d4a0 (patch)
treee086818fe2a44097ee4806aadeea559419402c93
parent640b3cdf1012e08e1a9f6225911aab2776cfe846 (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.clj1
-rw-r--r--src/jvm/clojure/lang/Ratio.java6
-rw-r--r--test/clojure/test_clojure/numbers.clj3
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)))