与BigInteger一样,当浮点数的长度过大导致double无法表示时,就要使用BigDecimal类型来表示。
使用前需要导入java.math.BigDecimal包,支持各种常见的运算。
方法 参数类型 返回类型
BigDecimal int BigDecimal
BigDecimal String BigDecimal
BigDecimal double BigDecimal
add BigDecimal BigDecimal
subtract BigDecimal BigDecimal
multiply BigDecimal BigDecimal
divide BigDecimal BigDecimal
divideAndRemainder BigDecimal BigDecimal[]//取模操作,数组第1位是商,第2位是余数
toString String
doubleValue double
floatValue float
intValue int
另外对浮点数的位数有舍入需求时,可以调用setScale(int,BigDecimal.type)来选择保留小数点后几位以及舍入方式。
ROUND_UP:向上舍入,如1.51就会舍成1.6
ROUND_DOWN:向下舍入,如1.55会舍成1.5
ROUND_HALF_EVEN:四舍五入,如1.55会舍成1.6,1.54会舍成1.5,-1.55会舍成-1.56,-1.54会舍成-1.5。
BigDecimal类型的举例应用:
黄金分割数是一个非常重要的常数,有些场合需要极高的精度。斐波那契数列相邻的两个数相除即为黄金分割数,越往后越精确,我们可以尝试用第10000位和第10001位的数相除,结果保留1000位。代码如下:
public static BigDecimal GoldenMean(int i) {
BigDecimal big1 = new BigDecimal(1);
BigDecimal big2 = new BigDecimal(2);
BigDecimal tmp;
while(i!=0) {
tmp = big2;
big2 = big2.add(big1);
big1 = tmp;
i--;
}
return big1.divide(big2,1000,BigDecimal.ROUND_HALF_EVEN);
}