Ésta es una versión ligeramente modificada de un ejemplo en 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)))
@ respuesta de number23_cn es el más adecuado para muchos casos. Sin embargo, una función real de redondeo con un argumento de precisión puede ser útil si, por ejemplo, desea visualizar una secuencia con cada número redondeado. A continuación, puede asignar round2
sobre la secuencia para dar formato a cada número a la vez:
(map (partial round2 2) [0.001 10.123456 9.5556])
que devuelve
(0.0 10.12 9.56)
Esto es más útil para una secuencia más larga, por supuesto.
Otra opción es utilizar cl-format
, que es una implementación de Common Lisp Clojure de format
. Es similar al format
de Clojure (que se basa en java.util.Formatter
) pero tiene una sintaxis diferente y permite algunos trucos más extravagantes.
(clojure.pprint/cl-format nil "~,2f" 23.456)
; => "23.46"
La directiva ~{ ~}
permite secuencias de procesamiento, como en el primer ejemplo anterior:
(clojure.pprint/cl-format nil "~{ ~,2f~}" [0.001 10.123456 9.5556])
; => " 0.00 10.12 9.56"
~{ ~}
espera ver una secuencia como un argumento, y comerá elementos de la secuencia de uno en uno utilizando cualquier las directivas aparecen entre ~{
y ~}
.
(El chapter on format
de Peter Seibel de Practical Common Lisp es la mejor introducción a Common Lisp de format
, y por lo tanto a Clojure de cl-format
, la OMI. El documentation on CL's format
en la fuente de costumbre, el Common Lisp Hyperspec, puede ser difícil de utilizar a veces. El section on CL's format
en Common Lisp The Language es un poco mejor.)
CL-formato debe ser utilizado en lugar de - formato es sólo una envoltura delgada alrededor del java. util.Formatter y por eso no maneja BigInt de Clojure, por ejemplo. A partir de Clojure 1.3, si su número es demasiado grande durante un tiempo, se desbordará en un BigInt, que es la implementación de Clojure, en lugar de BigInteger, que es la implementación de Java. Como es de suponer, java.util.Formatter no maneja la implementación de Clojure y arroja una excepción. – Unknown
no redondea, simplemente lo aplasta. – celwell