Это немного измененная версия примера на 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
, который представляет собой реализацию format
Common Lisp на языке Clojure. Он похож на 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"
~{ ~}
ожидает увидеть последовательность в качестве аргумента и будет потреблять элементы последовательности один за другим, используя любые директивы, находящиеся между ~{
и ~}
.
(глава о format
из книги Питера Сейбеля Practical Common Lisp — лучшее введение в Common Lisp format
и, следовательно, в Clojure cl-format
, imo. документация по CL format
в обычном источнике, Common Lisp Hyperspec, иногда может быть сложно использовать. //www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/clm/node200.html#SECTION002633000000000000000" rel="noreferrer">раздел о CL format
a> в Common Lisp The Language немного лучше.)
person
Mars
schedule
02.08.2014