如何在Clojure中切换科学记数法?

时间:2014-05-15 02:38:40

标签: clojure scientific-notation

我正在尝试使用Clojure来解决pythonchallenge问题:

(java.lang.Math/pow 2 38)

我得到了

2.74877906944E11

但是,我需要关闭这种科学记数法。我搜索了clojure文档,仍然不知道该怎么做。有没有一种通用的方法可以在Clojure中打开/关闭科学记数法?

感谢。

2 个答案:

答案 0 :(得分:6)

您可以使用format来控制结果的打印方式。

user> (format "%.0f" (Math/pow 2 38))
"274877906944"

此外,如果没有丢失想要的数据的危险,您可以转换为确切的类型:

user> 274877906944.0
2.74877906944E11
user> (long 274877906944.0)
274877906944

有更大输入的BigInts

user> (bigint 27487790694400000000.0)
27487790694400000000N

答案 1 :(得分:0)

警告

通过使用java.lang.Math/pow来计算整数的整数幂,通常会丢失精度。

例如

(bigint (java.lang.Math/pow 3 38))
; 1350851717672992000N

,而

(int-pow 3 38)
; 1350851717672992089

它适用于2的权力,因为 - 如果你用二进制查看它们 - 只有一个1位,其余的都是0。因此,当significand中的孤零零1位浮动时,十六进制指数只会继续上升。没有精度丢失。

顺便说一句,上面的int-pow只是重复乘法:

(defn int-pow [b ^long ex]
  (loop [acc 1, ex ex]
    (case ex
      0 acc
      (recur (* acc b) (dec ex)))))

这是一个评论而非解决方案,但不适合。