是否有任何理由在Clojure中默认的十进制文字不是BigDecimal类型?

时间:2015-12-22 15:08:24

标签: java clojure double bigdecimal literals

我了解到Clojure读者使用后缀“M'”(如1.23M)将十进制文字解释为BigDecimal。而且我也知道十进制数没有' M'成为Java双 但我认为正常的十进制数是BigDecimal会更好,而依赖于主机的十进制有后缀,比如1.23H。因此,当由于IEEE double的精度限制而导致数字被破坏或截断时,我们可以很容易地注意到该数字是精度受限的。另外,我认为更容易表达应该与主机无关。

除了时间性能之外,Clojure是否有任何理由将文字小数解释为Java double?另外,我不认为时间性能是一个答案,因为它不是C / C ++,并且声明依赖于主机的十进制的其他方式可以像' 1.23H'那样实现。

2 个答案:

答案 0 :(得分:10)

有一段时间,对于整数,Clojure会在需要时自动提升到更大的尺寸。这已被更改,以便抛出溢出异常。我的感觉,远远望去:

  1. Clojure的功能是在实际的时间内做实用的实用语言。他们不希望性能爆炸,因为数字操作意外地使用任意精度库而不是CPU整数操作。与似乎优先考虑数学上的好处而不是实用性的方案形成对比。
  2. 当操作系统调用失败时,人们不喜欢在运行时感到惊讶,因为Java库需要32位整数而不是任意大小的整数。
  3. 所以决定默认是使用普通整数(我认为Java长?)并且当程序员调用它时只使用任意大整数,当程序员知道他们愿意接受性能命中时,互操作命中。

    我的猜测是类似的决定,用于带小数点的数字。

答案 1 :(得分:4)

表现可能是一回事。也许clojure.core开发人员可能会对原因提出异议。

我个人认为默认情况下不要使用bigdecimal并不是一件大事,因为:

  • 正如你所指出的那样,有一个字面意思:M
  • +'*'-'等操作...(请注意引用)“支持任意精度”。