我正在尝试使用Clojure解决PythonChallenge问题:
(java.lang.Math/pow 2 38)
I got
2.74877906944E11
然而,我需要关闭这个科学计数法。我查阅了Clojure文档,仍然不知道该怎么做。是否有一种通用的方法在Clojure中切换科学计数法的开/关状态?
谢谢。
我正在尝试使用Clojure解决PythonChallenge问题:
(java.lang.Math/pow 2 38)
I got
2.74877906944E11
user> (format "%.0f" (Math/pow 2 38))
"274877906944"
user> 274877906944.0
2.74877906944E11
user> (long 274877906944.0)
274877906944
针对更大的输入,可使用BigInts。
user> (bigint 27487790694400000000.0)
27487790694400000000N
警告
使用java.lang.Math/pow
计算整数的幂,往往会失去精度。
例如:
(bigint (java.lang.Math/pow 3 38))
; 1350851717672992000N
而
(int-pow 3 38)
; 1350851717672992089
(defn int-pow [b ^long ex]
(loop [acc 1, ex ex]
(case ex
0 acc
(recur (* acc b) (dec ex)))))
这更像是一条评论而不是解决方案,但又不适合作为评论。
int-pow
可能更容易阅读:(defn int-pow [base exp] (if (zero? exp) 1N (* base (int-pow base (dec exp)))))
- Nickexp
,并且需要正常的JVM参数。 - Thumbnail这可以在大约22毫秒内计算出
3^20K`。 - Nick
(float the-number)
。这也很合理。 - Nick