轻量级 Java 十进制类

2022-09-03 15:35:30

我正在考虑编写两个有限精度的BigDecimal替代品,即DecimalInt和DecimalLong。这些将能够处理整数和长边的实数范围内的数字,具有任意数量的小数位数,可以以可变和不可变的形式创建。我的计划是使DecimalInt支持+/-999,999,999到+/- 0.99999999999和DecimalLong相同,但最多有18位数字。

为此,对于 DecimalInt,将十进制数字计数值 0-9 和 DecimalLong 的十进制数字计数值与存储为缩放整数或长整型的实际值一起保持 0-18。正常使用是小数小数,例如货币和股票价格,通常为小数点后2-4位。

基本要求是(a)精益足迹(2个类,加上OverflowException),以及(b)完全支持所有基本操作以及所有有意义的数学。

谷歌搜索结果没有返回任何明显的命中 - 它们似乎都与任意小数有关。

我的问题是:这已经完成了吗?这其中是否有隐藏的微妙之处,这就是为什么它还没有完成的原因?有没有人听说过Java支持像DotNet这样的十进制类型的谣言。

编辑:这与BigDecimal不同,因为它应该是(a)不处理整数数组的效率要高得多,并且(b)它不会包装BigInteger,因此它也将更依赖于内存,并且(c)它将具有可变选项,因此它在那里也会更快。总而言之 - 对于简单的用例,例如“我想存储银行余额而没有BigDecimal的开销和double的不准确性”,则开销较小。

编辑:我打算使用int或long进行所有数学运算,以避免经典问题:1586.60-708.75 = 877.8499999999999而不是877.85


答案 1

我强烈怀疑没有这样做的原因是BigDecimal和BigInteger的开销并不像你想象的那么重要,避免它不值得付出努力,也不值得以某种微妙的方式出错。

举个例子:对于任何金融应用程序来说,节省几十个字节是没有问题的,并且交易破坏者的精度有限(在美国,股票价格通常为2-4位,但如果你想与新兴市场打交道,你会遇到通货膨胀失控的货币,其中15位数的金额会给你买半条面包)。

基本上,这听起来只是另一种过早优化的情况。


答案 2

如果您正在查看用于处理货币的固定的小数位数,那么这通常是通过持有整数(如有必要,则为长)美分数或百分之一美分来完成的。

如果您正在处理金钱,那么您需要小心如何处理四舍五入。如果你的计算要被审计,那么关于如何完成这种事情的规则是有的。另外,我假设您知道某些操作无法精确完成(划分是明显的例子)。