这是clojure-doc.org上一个示例的略微修改版本:
(defn round2
"Round a double to the given precision (number of significant digits)"
[precision d]
(let [factor (Math/pow 10 precision)]
(/ (Math/round (* d factor)) factor)))
@number23_cn 的答案在很多情况下都是正确的。但是,如果您想显示一个对每个数字进行舍入的序列,则带有精度参数的实数舍入函数可能会很有用。然后,您可以简单地映射round2
序列以一次格式化每个数字:
(map (partial round2 2) [0.001 10.123456 9.5556])
返回
(0.0 10.12 9.56)
当然,这对于更长的序列更有用。
另一种选择是使用cl-format
,它是 Common Lisp 的 Clojure 实现format
。它类似于 Clojure 的format
(基于java.util.Formatter
),但语法不同,并允许一些更花哨的技巧。
(clojure.pprint/cl-format nil "~,2f" 23.456)
; => "23.46"
该~{ ~}
指令允许处理序列,如上面的第一个示例所示:
(clojure.pprint/cl-format nil "~{ ~,2f~}" [0.001 10.123456 9.5556])
; => " 0.00 10.12 9.56"
~{ ~}
期望将序列视为参数,并将使用出现在它们之间的任何指令一个一个地吃掉序列中的元素~{
和之间的任何指令一个一个地吃掉序列的元素~}
。
(来自 Peter Seibel 的Practical Common Lisp的章节format
是对 Common Lisp 的最佳介绍,因此也是对 Clojure 和imo 的最佳介绍。通常来源Common Lisp Hyperspec中关于 CL 的文档有时可能难以使用。关于 CL 的部分在Common Lisp 中语言稍微好一点。)format
cl-format
format
format