| java.math
|--java.math.BigDecimal
|--java.math.BigInteger
C/C++中遇到大数的情况往往什么令人头疼,需要用数组进行一系列复杂的操作。
而JAVA中则提供了十分方便的BigDecimal和BigInteger类.BigDecimal类针对大小数,
BigInteger则针对大整数.
BigDecimal简介
BigDecimal由任意精度的整数非标度值 和32位的整数标度(scale)组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以10的负scale次幂。因此,BigDecimal表示的数值是(unscaledValue×10-scale)。
主要构造函数:
BigDecimal(double val)
BigDecimal(int val)
BigDecimal(long val)
BigDecimal(Stringval)
在处理double的值时尽量采用BigDecimal(Stringval)构造函数,因为浮点数在存储时有着相当的不确定性,要取出BigDecimal的值时要先调用doubleValue()。
BigDecimalb0=newBigDecimal(1.2);
System.out.println(b0.toString());//1.1999999999999999555910790149937383830547332763671875
精度和舍入
setScale(int newScale)
setScale(int newScale, int roundingMode)
setScale(int newScale, RoundingMode roundingMode)
newScale:小数位数
roundingMode: 舍入方法
setScale(int newScale):此方法使用时容易抛出异常,因为没有定义如何舍入方式。
舍入方式:
ROUND_CEILING:向数轴正方向舍入
0.333 -> 0.34
-0.333 -> -0.33
ROUND_DOWN:向0舍入
0.333 -> 0.33
-0.333 -> -0.33
ROUND_FLOOR:向数轴正负方向舍入
0.333 -> 0.33
-0.333 -> -0.34
ROUND_HALF_UP: >= 0.5进一
0.5 -> 1.0
0.4 -> 0.0
ROUND_HALF_DOWN:> 0.5进一
0.5 -> 0.0
0.6 -> 1.0
ROUND_HALF_EVEN:如果进位的左边为偶数则舍,奇数则入
a = new BigDecimal("2.5"); //5左边的数是偶数,所以舍
b = new BigDecimal("1.5"); //左边的数是奇数,所以舍
a.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2
b.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2
BigDecimal的不可变性和算数操作
如果你定义了一个”2.00”的BigDecimal,那么”2.00”则永远都不会变
加减乘除的操作会返回一个新的BigDecimal对象
BigDecimal add(BigDecimalaugend)
Returns aBigDecimalwhose value is(this + augend), and whose scale ismax(this.scale(), augend.scale()).
BigDecimal divide(BigDecimaldivisor)
Returns aBigDecimalwhose value is(this / divisor), and whose preferred scale is(this.scale() - divisor.scale()); if the exact quotient cannot be represented (because it has a non-terminating decimal expansion) anArithmeticExceptionis thrown.
BigDecimal multiply(BigDecimalmultiplicand)
Returns aBigDecimalwhose value is(this × multiplicand), and whose scale is(this.scale() + multiplicand.scale()).
BigDecimal subtract(BigDecimalsubtrahend)
Returns aBigDecimalwhose value is(this - subtrahend), and whose scale ismax(this.scale(), subtrahend.scale()).