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

bur*_*wnn 7 java double clojure literals bigdecimal

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

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

Sha*_*nce 10

一旦有了整数,Clojure会在需要时自动升级到更大的尺寸.这已被更改,以便抛出溢出异常.我的感觉,远远望去:

  1. Clojure的功能是在实际的时间内做实际的实用语言.他们不希望性能爆炸,因为数字操作意外地使用任意精度库而不是CPU整数操作.与似乎优先考虑数学上的好处而不是实用性的方案形成对比.
  2. 当操作间调用失败时,人们不喜欢在运行时感到惊讶,因为Java库需要32位整数而不是任意大小的整数.

所以决定默认是使用普通整数(我认为Java长?)并且只有当程序员调用它时才会使用任意大整数,当程序员故意认为他们愿意接受性能命中时,以及inter - 击中.

我的猜测类似于小数点数的决定.


nha*_*nha 5

性能可能是一回事。也许clojure.core开发者可以插话一下原因。

我个人认为默认情况下不使用 bigdecimal 并不是什么大问题,因为:

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