我正在尝试使用Clojure来解决pythonchallenge问题:
(java.lang.Math/pow 2 38)
我得到了
2.74877906944E11
但是,我需要关闭这种科学记数法。我搜索了clojure文档,仍然不知道该怎么做。有没有一种通用的方法可以在Clojure中打开/关闭科学记数法?
感谢。
答案 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)))))
这是一个评论而非解决方案,但不适合。