【问题标题】:When I want all those zeros, I'll ask for them当我想要所有这些零时,我会要求它们
【发布时间】:2016-08-26 01:37:43
【问题描述】:

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 或类似的东西,那就太好了,这样 strprintln 等就会调用它,除非我使用 %f 明确格式化。否则,每次我创建或打印涉及包含浮点数的集合的字符串时,我都必须调用代码来生成该集合的修改版本,其中数字被修剪。

【问题讨论】:

    标签: clojure floating-point number-formatting


    【解决方案1】:

    我不认为 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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2014-05-16
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2021-07-05
      相关资源
      最近更新 更多