Clojure中数字的绝对值

Clojure中数字的绝对值,clojure,Clojure,在Clojure中如何计算值的绝对数 (abs 1) => 1 (abs -1) => 1 (abs 0) => 0 不推荐使用的clojure.contrib.math提供了一个函数 资料来源是: (defn abs "(abs n) is the absolute value of n" [n] (cond (not (number? n)) (throw (IllegalArgumentException.

在Clojure中如何计算值的绝对数

(abs  1) => 1
(abs -1) => 1
(abs  0) => 0

不推荐使用的
clojure.contrib.math
提供了一个函数

资料来源是:

(defn abs "(abs n) is the absolute value of n" [n]
  (cond
   (not (number? n)) (throw (IllegalArgumentException.
                             "abs requires a number"))
   (neg? n) (- n)
   :else n))

正如@NielsK在评论中指出的,是后续项目。

对于double、float、long和int,您可以使用java.lang.Math方法abs
(Math/abs-1)

注意,它不适用于小数、比率、bigint(eger)和其他Clojure数字类型。官方的clojure contrib数学库试图保证所有这些都能正常工作,这是您始终可以做到的

(defn abs [n] (max n (- n)))

当心,所有的人都有责任。长期以来,图书馆一直被弃用。使用这些库的示例是旧信息。clojure.contrib.math的继任者的名字是clojure.math.numeric-tower,@NielsK,谢谢,我已经在答案中包含了这些信息。还请注意,由于Java方法不是一流的,它们不能用作函数的独立参数。它们必须包装在另一个函数中,比如
(map#(Math/abs%)coll)
(comp#(Math/abs%)-)
等等。这也不是平台独立的(即JVM与ClojureScript),是吗?不,也不是。我想是时候使用cljc版本的数字塔了。(abs Long/MIN_值),向ArithmeticException@SerCe,这是由于
-
功能造成的。如果需要任意精度,则应使用
-'
(defn abs[n](max n(-'n))
@Shlomi No,这取决于函数中的实现选择。如果您正在创建一个适用于更广泛Clojure类型的
Math/abs
替代方案,那么您应该在答案中使用
-'
函数。