1.精确小数类型需要用BigDecimal类型
在JAVA中有8种基本数据类型(boolean, byte, short, int, long, float, double, char),其中float和double都是浮点型,但平常我们需要表示货币金额或小数类型的数值时,不能用这两种类型,因为浮点型的精确范围是不适用于日常的精确小数计算。
我们需要使用的类型是java.math.BigDecimal类型。
2.创建对象
使用BigDecimal(String val)的构造方法创建对象
如BigDecimal numA=new BigDecimal("0.6");,
尽量不要用参数为float或double的BigDecimal创建对象,如BigDecimal numA=new BigDecimal(0.6);
因为使用参数为float或double的BigDecimal创建对象会丢失精度,如
BigDecimal bdTest = new BigDecimal(1.745);
BigDecimal bdTest1 = new BigDecimal(0.745);
bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP);
bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bdTest:" + bdTest); // 1.75
System.out.println("bdTest1:" + bdTest1); // 0.74
3.数值计算
BigDecimal 类型不能用 +, -, *, / 来运算,需要用函数,如下:
BigDecimal numA=new BigDecimal("0.6");
BigDecimal numB=new BigDecimal("0.12");
//加法
System.out.println(numA.add(numB));//结果0.72
//减法
System.out.println(numA.subtract(numB));//结果0.48
//乘法
System.out.println(numA.multiply(numB));//结果0.072
//除法
System.out.println(numA.divide(numB));//结果5
注意,如果除法结果不是整数会报错,此时需要获取保留小数,使用函数为:
divide(BigDecimal divisor, int scale, int roundingMode)
divisor是除数,scale是精确度,roundingMode是结果的取值方式(如BigDecimal.ROUND_HALF_UP)。
例如 numA.divide(numB,2,RoundingMode.HALF_UP)
3.比较大小
BigDecimal 类型不能用 >,< 来运算,需要用compareTo函数,返回值表示为0:相等,1:大于,-1:小于
如下:
BigDecimal numA=new BigDecimal("0.6");
BigDecimal numB=new BigDecimal("0.12");
System.out.println(numA.compareTo(numB));//结果为 1
4.四舍五入
最常用的是ROUND_HALF_UP(向上取整) 和ROUND_HALF_DOWN(向下取整)
BigDecimal numA=new BigDecimal("0.625");
BigDecimal numB=new BigDecimal("0.125");
System.out.println(numA.setScale(2,BigDecimal.ROUND_HALF_UP));//结果0.63
System.out.println(numA.setScale(2,BigDecimal.ROUND_HALF_UP));//结果0.12
ROUND_HALF_UP是最常用
5.转为负数
new BigDecimail().negate() 返回负数
6.绝对值
new BigDecimal("-3.1").abs() 返回正数 3.1