diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index 41013216f5..9807d5dd22 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -3278,6 +3278,7 @@ (instance? clojure.lang.BigInt x) x (instance? BigInteger x) (clojure.lang.BigInt/fromBigInteger x) (decimal? x) (bigint (.toBigInteger ^BigDecimal x)) + (float? x) (bigint (. BigDecimal valueOf (double x))) (ratio? x) (bigint (.bigIntegerValue ^clojure.lang.Ratio x)) (number? x) (clojure.lang.BigInt/valueOf (long x)) :else (bigint (BigInteger. x)))) @@ -3291,6 +3292,7 @@ (instance? BigInteger x) x (instance? clojure.lang.BigInt x) (.toBigInteger ^clojure.lang.BigInt x) (decimal? x) (.toBigInteger ^BigDecimal x) + (float? x) (.toBigInteger (. BigDecimal valueOf (double x))) (ratio? x) (.bigIntegerValue ^clojure.lang.Ratio x) (number? x) (BigInteger/valueOf (long x)) :else (BigInteger. x))) diff --git a/test/clojure/test_clojure/numbers.clj b/test/clojure/test_clojure/numbers.clj index a040cc2680..f886f4f557 100644 --- a/test/clojure/test_clojure/numbers.clj +++ b/test/clojure/test_clojure/numbers.clj @@ -35,10 +35,20 @@ (not (float? v))))) (deftest BigInteger-conversions - (are [x] (biginteger x) - Long/MAX_VALUE - 13178456923875639284562345789M - 13178456923875639284562345789N)) + (doseq [coerce-fn [bigint biginteger]] + (doseq [v (map coerce-fn [ Long/MAX_VALUE + 13178456923875639284562345789M + 13178456923875639284562345789N + Float/MAX_VALUE + (- Float/MAX_VALUE) + Double/MAX_VALUE + (- Double/MAX_VALUE) + (* 2 (bigdec Double/MAX_VALUE)) ])] + (are [x] (true? x) + (integer? v) + (number? v) + (not (decimal? v)) + (not (float? v)))))) (deftest unchecked-cast-num-obj (do-template [prim-array cast]