これは、 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)
もちろん、これは長いシーケンスの場合に便利です。
もう1つのオプションはcl-format
、CommonLispのClojure実装であるを使用することformat
です。format
これはClojure(に基づいています)に似て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"
~{ ~}
~{
シーケンスを引数として見ることを期待し、との間に表示されるディレクティブを使用して、シーケンスの要素を1つずつ食べます~}
。
(PeterSeibelのPracticalCommon Lispの章format
は、Common Lispの、したがってClojureのimoの最良の入門書です。通常のソースであるCommon Lisp HyperspecのCLに関するドキュメントは、使用するのが難しい場合があります。CLのセクションCommonLispでは言語は少し優れています。)format
cl-format
format
format