2016-05-01 26 views
1

在Clojure中是否有一些全局的方式來設置浮點數的默認格式?當我想要所有這些零,我會問他們

通常我在嵌套集合中有浮點數。舉一個小例子,這個表情,

(str " -> " linkvec) 

在一些代碼一對夫婦矢量我的工作,現在,評估生產:

-> [:source1 :output 0.2 0.2 1] 
-> [:source100 :output 0.6000000000000001 0.6000000000000001 100] 

大部分的時間,我不關心小數點後顯示16位數的小小舍入錯誤。我寧願將所有浮點數輸出四捨五入到最接近的0.001,舍入後去掉​​尾隨零。所以,上面會出來找這樣的:

-> [:source1 :output 0.2 0.2 1] 
-> [:source100 :output 0.6 0.6 100] 

注意,期望輸出爲0.6 0.6,不0.600 0.600

當然,我可以定義一個函數是這樣的:

(defn sigfigs [x] 
    (format "%.3f" (-> x (* 1000) (math/round) (/ 1000.0)))) 

但後來我不得不來自世界各地調用它。如果我可以將默認的數字格式化程序設置爲sigfigs或其他類似的程序,以便str,println等會調用該程序,除非我明確使用%f進行格式化,那將會很好。否則,每次我打印或打印一個涉及包含浮點數的集合的字符串時,我都必須調用代碼來生成該集合的修改版本,其中的數字將被修剪。

回答

2

我不認爲str可以改變(它只是調用的toString),但print/println你可以做到這一點使用無證print-method多方法:

(defmethod print-method java.lang.Double [value ^java.io.Writer w] 
    (.write w (.format (java.text.DecimalFormat. "0.###") value))) 
相關問題