2016-03-02 74 views
1

我知道要爲Clojure中的數字設置精度,我應該使用with-precision函數,並且我知道它僅適用於BigDecimal值。Clojure - 如何設置較低的精度

(defn bar-triang [[a b] [c d] [e f]] 
    (def cen [(/ (+ a c) 2.0) (/ (+ b d) 2.0)]) 
    (def g (get cen 0)) 
    (def h (get cen 1)) 
    [(with-precision 4 (+ (bigdec g) (/ (- e g) 3M))) 
    (with-precision 4 (+ (bigdec h) (/ (- f h) 3M)))]) 

(bar-triang [4, 6], [12, 4], [10, 10]) 
=> [8.666666666666666 6.666666666666667] 

在這裏,我把精度設置爲4,但是REPL給了我和前面相同的數字,並且有更多的數字。此外,我使用bigdec強制gh爲BigDecimal,但問題依然存在。我怎麼解決這個問題?

+1

不涉及精度,但聲明局部變量使用'let'就像'(let [a 3] ..)' - 您有效地聲明'cen''g'和'h'爲全局可訪問變量 – birdspider

回答

1

有點重構後:

  1. 使用let代替def
  2. 爲什麼產生cen載體時,你只使用_M的數字文字
  3. 整個包住需要hg
  4. 東西在with-precision 4
  5. bigdec c oercions(THX /u/glts
  6. 這未必是最好的變種,但據我所知它產生你想要的輸出
  7. 這可能是使用Clojure

(defn bar-triang [[a b] [c d] [e f]] 
    (with-precision 4 
    (let [g (/ (+ a c) 2M) 
      h (/ (+ b d) 2M)] 
     [(+ g (/ (- e g) 3M)) 
     (+ h (/ (- f h) 3M))]))) 
#'user/bar-triang 
user=> (bar-triang [4, 6], [12, 4], [10, 10]) 
[8.667M 6.667M] 
應用/研究自動化測試的好時機
+0

是的,謝謝,它解決了所描述的問題。但現在我意識到,'精確度'函數計算數字中的所有數字,而我只想在浮點數後限制數字。 –

+0

@GrigoriyYanushkovsky所以你想圍繞它 - 這通常是計算的最後一步(爲什麼你會計算四捨五入的值),因此它通常是在「字符串」上下文中的操作:請參閱'clojure.core/format' - http: //stackoverflow.com/questions/10751638/clojure-rounding-to-decimal-places – birdspider

+0

@birdspider不,我只想圓整的結果。感謝幫助! –