我们知道使用float或double不是需要正确精度的选项,我们知道BigDecimal可以达到这个目的,但我们也知道它比常规基元操作慢100倍。
如果速度对我们来说至关重要,我们该怎么做?我们确实需要精确度?
我试图将货币的价值存储在最慢的单位并存储其转换,如1 BTC = 100000000 satoshi但经过几次实验后很明显,您只是无法存储100BTC,超过最大可能值。是的,有一种选择可以牺牲精确度,比如存储microBTC等等,但问题更全局,我们如何用基元设计这样的东西?
答案 0 :(得分:5)
正如D.E.Knuth在他的第2卷“计算机程序设计的艺术”中所充分记录的那样。以任意精度实现算术不是黑色艺术" - 参见章节" Seminumerical Algorithms"。我已经完成了这项工作,遵循了实施COBOL计算的必要性(所以:不仅仅是整数)。
此外,如果不为每个新的op结果重新创建对象,则可以选择BigInteger或BigDecimal。是的,这意味着工作,但如果你真的认为你需要它......
我发现,就算术而言,BigInteger并不是那么慢。真正为我使用它的原因是必须频繁地在二进制和十进制(十进制数组之间)之间进行转换。
答案 1 :(得分:1)
您的选择是:
BigDecimal
- 准确有效 - 比原语慢,但可能没有可测量的 - 大多数是不可变的(即可以改变准确性而不是价值)。
long
- 准确但有价值限制 - 原始因此不能为速度而牺牲 - 不可变 - 数学更容易和更清晰地写。
BigInteger
- 可能是你在上面之间最好的中途 - 不可改变,所以你必须在改变价值时制作新的 - 你不太可能达到它的极限。