Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure中切换科学符号?_Clojure_Scientific Notation - Fatal编程技术网

如何在Clojure中切换科学符号?

如何在Clojure中切换科学符号?,clojure,scientific-notation,Clojure,Scientific Notation,我正在尝试使用Clojure解决pythonchallenge问题: (java.lang.Math/pow 2 38) 我得到 2.74877906944E11 但是,我需要关闭这个科学符号。我搜索了clojure的文档,仍然不知道该怎么办。在Clojure中是否有打开/关闭科学记数法的通用方法 谢谢。您可以用它来控制结果的打印方式 user> (format "%.0f" (Math/pow 2 38)) "274877906944" 此外,如果没有丢失所需数据的危险,您可以强制

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

(java.lang.Math/pow 2 38)
我得到

2.74877906944E11
但是,我需要关闭这个科学符号。我搜索了clojure的文档,仍然不知道该怎么办。在Clojure中是否有打开/关闭科学记数法的通用方法

谢谢。

您可以用它来控制结果的打印方式

user> (format "%.0f" (Math/pow 2 38))
"274877906944"
此外,如果没有丢失所需数据的危险,您可以强制转换为确切的类型:

user> 274877906944.0
2.74877906944E11
user> (long 274877906944.0)
274877906944
对于较大的输入有较大的输入

user> (bigint 27487790694400000000.0)
27487790694400000000N

警告

使用
java.lang.Math/pow
来计算整数的整数幂常常会失去精度

比如说

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

(int-pow 3 38)
; 1350851717672992089
它与
2
的幂一起工作,因为如果你用二进制查看它们,则有一个
1
位,其余的
0
s位。所以十六进制指数一直在上升,而孤立的
1
位在。准确度没有损失

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

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


这与其说是一个解决方案,不如说是一个评论,但实际上并不合适

很有效,谢谢!如果我想把一个大数字转换成它的科学符号呢?它使用java格式化程序的格式-so%E(带有可选的前缀用于精度控制)。非常感谢!“%e”确实有效。如果数字不是浮点数,我必须先
(浮点数)
。这也是合乎逻辑的。谢谢。当我遇到大量的计算时,我会回到这里作为参考。@Nick你可以找到一个温和的介绍。标准书籍《Clojure编程》和《Clojure编程》涵盖了这两本书都值得一读的主题。不过,不要使用旧版本:一些细节在几年前发生了变化(我认为是Clojure版本1.3)。祝你一切顺利,尽情享受!谢谢。我正在读Clojure编程(OReilly),这是一本很棒的书。我是一个没有计算机科学背景的编程新手,所以对我来说有点难。幸运的是,Clojure社区的人非常乐于助人,也非常友善,这也给了我很多鼓励。很久以前,我又找到了这篇文章。我认为这个
int-pow
可能更容易阅读:
(defn int-pow[base exp](if(zero?exp)1N(*base(int-pow-base)(dec exp))
@Nick Yes。它更容易阅读。但它是正确的递归,因此速度较慢,并且限制在
exp
小于10K左右,并且具有正常的JVM参数。