双打正在污染我的BigDecimal数学

Car*_*ate 3 clojure

我正在写一个Mandelbrot Set资源管理器.我需要尽可能多的精度,所以我可以尽可能放大.

我注意到混合doubles和BigDecimals 的不幸副作用:它们"污染"了返回的类型:

(type (* 1M 2))
=> java.math.BigDecimal

(type (* 1M 2.0))
=> java.lang.Double
Run Code Online (Sandbox Code Playgroud)

我期待相反.BigDecimals可能更精确,应该污染双打.

除了手动调用bigdec可能与a接触的每个数字之外BigDecimal,还有一种方法可以防止doubledoubles和BigDecimals 上进行数学运算时自动降级吗?

ama*_*loy 9

一旦引入double等式,就可以限制可能具有的精度.一个精确到一百万个小数位的BigDecimal对你来说是没用的,如果你得到它的方式乘以只有15个左右有效数字的东西.您可以将结果提升为BigDecimal,但无论您喜欢与否,都会失去很多精确度.因此,Clojure的推广规则通过回馈双精度而不是高精度BigDecimal,使你明白这一点.

例如,请参阅http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-,以解释为什么将双精度转换为BigDecimals是一个坏主意. ,隐式或明确地.