我正在考虑为BigDecimal写两个有限精度的替代品,即DecimalInt和DecimalLong.这些将能够处理int和long的实际边界内的数字以及任意数量的小数位,可以以可变形式和不可变形式创建.我的计划是使DecimalInt支持+/- 999,999,999到+/- 0.999999999和DecimalLong相同,但最多18位数.
这可以通过将DecimalInt的十进制数字计数值保持为0-9,将DecimalLong的十进制数字计数值保持为0-18以及存储为缩放的int或long的实际值来完成.正常使用的是小数字小数,例如金钱和股票价格,通常为2-4位小数.
基本要求是(a)精益足迹(2个类,加上OverflowException),以及(b)完全支持所有基本操作以及所有有意义的数学.
谷歌搜索结果没有返回任何明显的命中 - 它们似乎都属于任意小数.
我的问题是:这已经完成了吗?这有隐藏的微妙之处,这就是为什么它还没有完成?有没有人听说过Java支持像DotNet这样的十进制类型的传言.
编辑:这与BigDecimal不同,因为它应该是(a)不处理一组int的更高效的地狱,并且(b)它不会包装BigInteger所以它也会在内存上更精简,并且(c)它有一个可变选项,所以它也会更快.总而言之 - 对于简单的用例,例如"我想存储银行余额而没有BigDecimal的开销和双精度的不准确性",开销更少.
编辑:我打算用int或long做所有的数学运算来避免经典问题:1586.60-708.75 = 877.8499999999999而不是877.85
我强烈怀疑为什么没有这样做的原因是BigDecimal和BigInteger的开销并不像你想象的那么重要,并且避免它不值得努力以及以某种微妙的方式弄错它的风险.
使用你的例子:对于任何金融应用程序,节省几十个字节是一个非问题和有限的精度是一个交易破坏者(股票价格我通常在美国2-4位数,但如果你想与新兴市场打交道,你会遇到通货膨胀失控的货币,15位数的货币会给你买半条面包.
基本上,这听起来只是另一种过早优化的情况.