【问题标题】:What is the best way to round numbers in Clojure?在 Clojure 中对数字进行四舍五入的最佳方法是什么?
【发布时间】:2015-02-16 21:54:02
【问题描述】:

这很简单。但无论如何,我认为在这里回答这个问题是个好主意,以便更快、更轻松地参考。

这个操作:

(/ 3 2)

产生这个:

3/2

我需要一个函数进行四舍五入,得到 2,另一个函数向下舍入,得到 1。

【问题讨论】:

    标签: clojure rounding


    【解决方案1】:

    你可以 java interop (Math/(floor|ceil)。例如:

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

    【讨论】:

      【解决方案2】:

      将其转换为所需的类型

      (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
      

      【讨论】:

      【解决方案3】:

      您也可以使用 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

      【讨论】:

        【解决方案4】:

        试试这个,它会为非负分子和正分母生成一对地板和天花板:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-07
          • 2011-09-14
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多