Clojure 数值处理:精度、相等性与性能优化
1. 任意精度小数运算的缩放和舍入模式
在使用 Java 的 BigDecimal 时,许多操作默认会失败。例如:
new BigDecimal(1).divide(new BigDecimal(3));
这会抛出 java.lang.ArithmeticException ,提示“Non - terminating decimal expansion; no exact representable decimal result.”。若要使操作正常进行,需指定舍入模式和最大精度,代码会变得更冗长:
new BigDecimal(1).divide(new BigDecimal(3), new MathContext(10, RoundingMode.HALF_UP));
Ruby 的任意精度小数实现也有类似成本,不过权衡方式不同,其在 Decimal 类中全局设置数学上下文参数。
Clojure 提供了 with - precision 宏,可显著简化此过程。示例代码如下:
(/ 22M 7)
;= #<ArithmeticException java.lang.ArithmeticException:
;= N
超级会员免费看
订阅专栏 解锁全文
19

被折叠的 条评论
为什么被折叠?



