2016-05-01 6 views
1

Clojureには浮動小数点数のデフォルトフォーマットを設定するグローバルな方法がありますか?これらのゼロをすべて欲しければ、私はそれらを尋ねます

多くの場合、ネストされたコレクション内に浮動小数点数があります。小さな例を取るために、この表現、私は今働いている

いくつかのコードではカップルのベクトルに評価さ
(str " -> " linkvec) 

は、生成:時間の

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

ほとんどを、私はしないでください小数点の後に16桁の小さな丸め誤差が気になります。私はすべての浮動小数点出力を四捨五入の後に削除された末尾のゼロと共に、0.001に最も近い値に丸めることが望ましいでしょう。所望の出力が0.6 0.6、ない0.600 0.600であること

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

がお知らせ:だから、上記のように探して出てくるでしょう。

もちろん私のような機能何か定義することができます。

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

をしかし、私はどこからでもそれを呼び出す必要があるだろう。デフォルトの数値フォーマッタをsigfigsなどに設定できれば、%fで明示的に書式化しない限り、strprintlnなどが呼び出されるといいでしょう。それ以外の場合は、浮動小数点数を含むコレクションを含む文字列を作成または印刷するたびに、コードを呼び出して、そのコレクションの修正バージョンを生成し、番号がトリムされるようにする必要があります。

答えて

2

私はstrを変更することができないと思います(それだけのtoStringを呼び出します)が、print/printlnのためにあなたが文書化されていないprint-method multimethodを使用してこれを行うことができます。

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