思考:以下程序输出结果是多少?
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2);
}
结果为:0.999999999999999998
由于很多实际应用中需要精确运算,而double是近似值储存,并不符合要求,故而在精度要求非常高的情况下我们使用精确存储的BigDecimal;
BigDecimal位于java.math包中,作用是精确计算浮点数;
创建方式:BigDecimal bd = new BigDecimal("1.0");
在BigDecimal的使用过程中,涉及到加减乘除运算有一套自己的方法:
add();加法;
subtract();减法;
multiply();乘法;
divide();除法;
涉及到除不尽的数时,需要涉及到divede();的重写方法,其中包含三个参数;
val:数值;scale:保留几位小数;RoundingMode:舍入方法;
以下列出BigDecimal给出的舍入方法汇总:
关于银行家舍入模式:若舍入位大于5或者舍入位等于五且前一位为奇数,则对舍入部分的前一位数字加一;若舍入位小于5或者舍入位等于5且前一位为偶数,则直接舍弃;
根据给定的舍入模式将输入数字舍入为一位数的结果 | |||||||
舍入模式 | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN | HALF_EVEN |
具体描述 | 向外取整 | 去尾 | 向上取整 | 向下取整 | 四舍五入 | 五舍六入 | 银行家舍入模式 |
输入数字5.5的得数 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
输入数字-5.5的得数 | -6 | -5 | -5 | -6 | -6 | -5 | -6 |
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2);//0.09999999999999998
//BigDecimal 大浮点数精确计算
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
BigDecimal result1 = bd1.subtract(bd2);//subtract(); 减法
BigDecimal result2 = bd1.add(bd2);//add(); 加法
BigDecimal result3 = bd1.multiply(bd2);//multiply(); 乘法
BigDecimal result4 = bd1.divide(bd2,2);//divide(); 除法,保留两位小数
BigDecimal result5 = new BigDecimal("20")
.divide(new BigDecimal("3"),10, RoundingMode.HALF_UP);
//保留十位小数且四舍五入
System.out.println(result1);//0.1
System.out.println(result2);//1.9
System.out.println(result3);//0.90
System.out.println(result4);//1.2
System.out.println(result5);//6.6666666667
}