web-dev-qa-db-fra.com

Quel est le meilleur moyen d'arrondir les nombres dans Clojure?

C'est facile. Quoi qu'il en soit, je pense que c'est une bonne idée de répondre à cette question ici pour une référence plus rapide et plus facile.

Cette opération:

(/ 3 2)

donne ceci: 

3/2

Il me faut une fonction pour arrondir, qui donnerait 2 et une autre pour arrondir, qui donnerait 1.

27
Carlos Nunes

Vous pouvez interopérer Java (Math/(floor | ceil).

user=> (int (Math/floor (/ 3 2)))
1
user=> (int (Math/ceil (/ 3 2)))
2
41
cfrick

jette le type désiré

(int 3/2) 
=> 1
(double 3/2)
=> 1.5
(float 3/2)
=> 1.5

puis enroulez-le dans un appel à Math.round etc.

user> (Math/round (double 3/2))
2
user> (Math/floor (double 3/2))
1.0
user> (Math/ceil (double 3/2))
2.0
24
Arthur Ulfeldt

Vous pouvez aussi utiliser la fonction with-precision

=> (with-precision 10 :rounding FLOOR (/ 1 3M))
0.3333333333M
=> (with-precision 10 :rounding CEILING (/ 1 3M))
0.3333333334M

https://clojuredocs.org/clojure.core/with-precision

Essayez ceci, qui produit une paire de plancher et de plafond pour le numérateur non négatif et le dénominateur positif:

(fn [num den] (let [q (quot num den)
                    r (rem  num den)]
                [q (if (= 0 r) q (+ 1 q))])
0
Reb.Cabin