对于我的加密货币交易程序,我想将所有浮点数截断到恰好8个位置.我怎么能在Clojure中做到这一点?
这是一个相关的代码示例:
(with-precision 8 :rounding DOWN
(bigdec
(+ 0.2
0.0109 ; 1/1
0.0285 ; 1/2
0.02858 ; 1/3
0.01963 ; 1/4
0.00392977 ; 1/5
0.00956410 ; 1/6
0.02322879 ; 1/7
0.01547502 ; 1/8
0.01616702 ; 1/9
0.01463114 ; 1/10
0.00843843 ; 1/11
0.01162393 ; 1/12
)))
Run Code Online (Sandbox Code Playgroud)
它目前返回,0.39066819999999997但我希望它返回0.39066819.
我会使用with-precision它允许您使用BigDecimal数字指定数学运算的精度和舍入模式- 您应该使用它们而不是浮点数来处理货币金额.请注意,M在数字文字中表示它是一个BigDecimal值.你可以强迫你的号码BigDecimal有bigdec.如果您想截断结果,则需要使用DOWN舍入模式.
(with-precision 3 :rounding DOWN
(+ (bigdec 0.1111111111) 0.22222222M))
;; => 0.333M
Run Code Online (Sandbox Code Playgroud)
确保您的操作在BigDecimals 上完成,因为转换bigdec不受以下因素影响with-precision:
(with-precision 3 :rounding DOWN
(bigdec 0.11111111))
;; => 0.11111111M
(with-precision 3 :rounding DOWN
(* 1M (bigdec 0.11111111)))
;; => 0.111M
Run Code Online (Sandbox Code Playgroud)
如果要BigDecimal直接修改该值,则需要使用Java interop(通过BigDecimal构造函数接受正确配置MathContext或通过调用.round实例方法).