不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。

虽然双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。floatdouble只能用来做科学计算或者是工程计算,

1. 在商业计算中要用java.math.BigDecimal,用来对超过16位有效位的数进行精确的运算。

BigDecimal创建的是对象,不能使用+、-、*、/等直接对其对象进行数学运算,而是调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

例如:

System.out.print(0.1 + 0.2);

输出:

0.30000000000000004

2. 构造器描述:

BigDecimal(int)       创建一个具有参数所指定整数值的对象。 
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long)    创建一个具有参数所指定长整数值的对象。 
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用

在涉及到double数据时,建议优先使用String构造方法,即Double.toString(double)转成String

例子:

BigDecimal doubleString = new BigDecimal(1.1);
System.out.println(doubleString);

结果:

1.100000000000000088817841970012523233890533447265625

3. 方法描述:

add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。 
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。 
multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。 
divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。 
toString()                将BigDecimal对象的数值转换成字符串。 
doubleValue()          将BigDecimal对象中的值以双精度数返回。 
floatValue()             将BigDecimal对象中的值以单精度数返回。 
longValue()             将BigDecimal对象中的值以长整数返回。 
intValue()               将BigDecimal对象中的值以整数返回。

4. 注意divide方法:

divide(BigDecimal,保留小数点后几位小数,舍入模式)

舍入模式:

ROUND_CEILING    //向正无穷方向舍入
ROUND_DOWN    //向零方向舍入
ROUND_FLOOR    //向负无穷方向舍入
ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
ROUND_UP    //向远离0的方向舍入

5. 使用:

// 加减乘除
BigDecimal first = new BigDecimal("12.3");
BigDecimal end = new BigDecimal("3");
System.out.println(first.add(end));
System.out.println(first.subtract(end));
System.out.println(first.multiply(end));
System.out.println(first.divide(end));
// float和double型数据
float a = 1.2f;
double b = 1.1;
BigDecimal doubleStr = new BigDecimal(Float.toString(a));
BigDecimal floatStr = new BigDecimal(Double.toString(b));
System.out.println(doubleStr.multiply(floatStr));
// 除法,保留小数(四舍五入保留2位小数)
System.out.println(doubleStr.divide(floatStr, 2, BigDecimal.ROUND_HALF_UP));

输出:

15.3
9.3
36.9
4.1
1.32
1.09

  

  

博客借鉴:https://blog.csdn.net/qq_35868412/article/details/89029288

posted on 2021-09-21 10:01  smile学子  阅读(256)  评论(0)    收藏  举报