2014-02-26 41 views
6

我正在寻找一个java类,它将保存一个任意的预设精度的十进制值。类BigDecimal看起来是一个很好的候选者,但我希望能够将小数的大小限制在最终用户决定的范围内。从字面上看,最终用户将以10为基数指定一个范围,我将分配足够的字节来表示该范围内的任何数字。任意预置精度小数(几乎像BigDecimal)

我正在考虑扩展BigDecimal。在这个课程中,我将添加模拟一个预设范围内的小数的必要功能。

我对社区的问题是: 是否有任何库已经这样做?
会延长BigDecimal是合理的事情吗?

+0

指定范围?最大值?最大绝对值?小数位数?小数位数?请注意,这个问题中有没有任何图书馆的内容是无关紧要的。 – EJP

+1

请注意,BigDecimal已经具有一个比例值,当它为正值时,本质上限制了小数点右边的位数。您还可以提供[MathContext](http://docs.oracle.com/javase/7/docs/api/java/math/MathContext.html)以保持此比例。 – Gassa

+0

那么,您需要从现有行为中得到什么区别?如果它是性能,如标签所示,小数的预期长度是多少?成千上万的?更重要的是,你有没有在你的使用案例中对BigDecimal进行基准测试,并确认这个瓶颈恰恰在于它们如何处理规模? – Gassa

回答

3

我建议你中间的方式在你提出的建议之间:

Apfloat库是尝试着,检查了API docs的好办法。
Apcomplex是一个包装类,用于例如一个BigDecimal

所以在这里,你将有一个很大的自由,重写和增强刚刚应用这个类的新方法。

1

有趣的是,BigDecimal拥有您所需要的一切。简单的方法添加(BigDecimal),乘(BigDecimal)等等。以无限的精度工作。

方法add(BigDecimal,MathContext),multiply(BigDecimal,MathContext)等等。允许指定一个请求的上限位数,得到的尾数应该有。

所以基本上你得到的结果早在形式:

sign * mantissa * 10^exponent 

有了保证0=< mantissa < 10^requested。这些方法根据MathContext中指定的mode进行舍入。