六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 40|回复: 0

Dive Into BigDecimal (pending)

[复制链接]

升级  70%

7

主题

7

主题

7

主题

童生

Rank: 1

积分
35
 楼主| 发表于 2013-1-28 18:45:22 | 显示全部楼层 |阅读模式
在Java中处理大数值的精度问题, 可以考虑使用 BigDecimal或BigInteger.
 
环境如下:
OS: Windows XP Service Pack 2
JDK: 1.5.0_10
 
 
BigDecimal bc = new BigDecimal("15323121312.052");BigDecimal bc2 = new BigDecimal("13123234.12");Assert.assertEquals("15336244546.172", bc.add(bc2).toString());Assert.assertEquals("15309998077.932", bc.subtract(bc2).toString());Assert.assertEquals("201088908427219973.61424", bc.multiply(bc2).toString());// java.lang.ArithmeticExceptionAssert.assertEquals("1167.63300661529309057240", bc.divide(bc2).toString());  
运算结果的首选标度
max(addend.scale(), augend.scale())
max(minuend.scale(), subtrahend.scale())
multiplier.scale() + multiplicand.scale()
dividend.scale() - divisor.scale()
 
从某种意义上说, BigDecimal可以处理任意位数的数值, 查阅Source便可知:
 
BigDecimal实际上内部维护一个数组
/**     * The magnitude of this BigInteger, in <i>big-endian</i> order: the     * zeroth element of this array is the most-significant int of the     * magnitude.  The magnitude must be "minimal" in that the most-significant     * int (<tt>mag[0]</tt>) must be non-zero.  This is necessary to     * ensure that there is exactly one representation for each BigInteger     * value.  Note that this implies that the BigInteger zero has a     * zero-length mag array.     */    int[] mag;  
// 避免小数无限循环, 指定精度位数和RoundingMode bc.divide(bc2, 3, RoundingMode.HALF_UP);
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表