如何在Clojure中切换科学符号?
我正在尝试使用Clojure解决pythonchallenge问题:如何在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" 此外,如果没有丢失所需数据的危险,您可以强制
(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参数。