2016-05-01 22 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))) 
相关问题