在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.ArithmeticException
Assert.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);
本文介绍在Java中如何使用BigDecimal处理大数值的精度问题,并通过示例展示了加、减、乘、除等运算的具体操作及结果。
1521

被折叠的 条评论
为什么被折叠?



