Clojure 当我想要所有这些零时,我';我会要的

Clojure 当我想要所有这些零时,我';我会要的,clojure,floating-point,number-formatting,Clojure,Floating Point,Number Formatting,Clojure中是否有一些全局方法来设置浮点数的默认格式 我经常在嵌套集合中使用浮点数。举个小例子,这个表达式 (str " -> " linkvec) 在我现在正在编写的一些代码中对两个向量求值,生成: -> [:source1 :output 0.2 0.2 1] -> [:source100 :output 0.6000000000000001 0.6000000000000001 100] 大多数时候,我不在乎小数点后16位出现的小舍入错误。我更喜欢将所有浮点输

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
显式格式化。否则,每次我制作或打印一个包含浮点数的集合的字符串时,我都必须调用代码来生成该集合的修改版本,其中的数字会被修剪。

我认为
str
无法更改(它只调用toString),但是对于
print
/
println
您可以使用未记录的多方法执行此操作:

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