一、为什么要用BigDecimal?
首先,我们先看一下,下面这个现象
public class yrx {
@Test
public void test1(){
System.out.println(0.2+0.1);
System.out.println(0.3-0.2);
System.out.println(0.2*0.1);
System.out.println(0.6/0.2);
}
}
测试结果:显然输出的结果不正确
那为什么会出现这种情况呢?
-
因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。
-
十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值【根本原因】
但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确,
二、BigDecimal是什么?
1、简介
Java在java.math
包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+ - * /
等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
2、构造器描述
BigDecimal(int)
创建一个具有参数所指定整数值的对象。
BigDecimal(double)
创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long)
创建一个具有参数所指定长整数值的对象。
BigDecimal(String)
创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
3、方法描述
add(BigDecimal)
BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal)
BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal)
BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal)
BigDecimal对象中的值相除,然后返回这个对象。
toString()
将BigDecimal对象的数值转换成字符串。
doubleValue()
将BigDecimal对象中的值以双精度数返回。
floatValue()
将BigDecimal对象中的值以单精度数返回。
longValue()
将BigDecimal对象中的值以长整数返回。
intValue()
将BigDecimal对象中的值以整数返回。
特别说明一下,为什么BigDecimal(double) 不推荐使用,
@Test
public void test2(){
BigDecimal str =new BigDecimal("2.6878")<