在 Clojure 中舍入数字的最佳方法是什么?
What is the best way to round numbers in Clojure?
这很简单。但无论如何,我认为在这里回答这个问题是个好主意,以便更快、更轻松地参考。
本次操作:
(/ 3 2)
产生这个:
3/2
我需要一个向上舍入的函数,它会产生 2,另一个向下舍入的函数,它会产生 1。
将其转换为所需的类型
(int 3/2)
=> 1
(double 3/2)
=> 1.5
(float 3/2)
=> 1.5
然后将其包装在对 Math.round
等的调用中
user> (Math/round (double 3/2))
2
user> (Math/floor (double 3/2))
1.0
user> (Math/ceil (double 3/2))
2.0
您可以 java 互操作 (Math/(floor|ceil)。例如:
user=> (int (Math/floor (/ 3 2)))
1
user=> (int (Math/ceil (/ 3 2)))
2
试试这个,它为非负分子和正分母生成一对下限和上限:
(fn [num den] (let [q (quot num den)
r (rem num den)]
[q (if (= 0 r) q (+ 1 q))])
您也可以使用 with-precision 函数
进行舍入
=> (with-precision 10 :rounding FLOOR (/ 1 3M))
0.3333333333M
=> (with-precision 10 :rounding CEILING (/ 1 3M))
0.3333333334M
Clojure 1.11 版添加了带有舍入函数的新 clojure.math namespace。所以你不再需要明确的互操作:
=> (require '[clojure.math :refer [ceil floor round]])
=> (ceil 3/2)
2.0
=> (floor 3/2)
1.0
=> (round 3/2)
2
这很简单。但无论如何,我认为在这里回答这个问题是个好主意,以便更快、更轻松地参考。
本次操作:
(/ 3 2)
产生这个:
3/2
我需要一个向上舍入的函数,它会产生 2,另一个向下舍入的函数,它会产生 1。
将其转换为所需的类型
(int 3/2)
=> 1
(double 3/2)
=> 1.5
(float 3/2)
=> 1.5
然后将其包装在对 Math.round
等的调用中
user> (Math/round (double 3/2))
2
user> (Math/floor (double 3/2))
1.0
user> (Math/ceil (double 3/2))
2.0
您可以 java 互操作 (Math/(floor|ceil)。例如:
user=> (int (Math/floor (/ 3 2)))
1
user=> (int (Math/ceil (/ 3 2)))
2
试试这个,它为非负分子和正分母生成一对下限和上限:
(fn [num den] (let [q (quot num den)
r (rem num den)]
[q (if (= 0 r) q (+ 1 q))])
您也可以使用 with-precision 函数
进行舍入=> (with-precision 10 :rounding FLOOR (/ 1 3M))
0.3333333333M
=> (with-precision 10 :rounding CEILING (/ 1 3M))
0.3333333334M
Clojure 1.11 版添加了带有舍入函数的新 clojure.math namespace。所以你不再需要明确的互操作:
=> (require '[clojure.math :refer [ceil floor round]])
=> (ceil 3/2)
2.0
=> (floor 3/2)
1.0
=> (round 3/2)
2