Fork me on GitHub

BigDecimal

我们已知Java中有8种基本数据类型,整型:byte 、short、int、long ,浮点类型:float、double,boolean以及char,当进行科学计算时,我们使用long和double,但是当我们进行一些商业计算时,用这些基本类型可能会出现精度丢失问题,因此在商业中一定要用BigDecimal。

测试一

1
2
3
4
5
6
7
8
@Test
public void test1()
{
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
}

运行结果:

1
2
3
4
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

分析:当用户要购买两件商品,一件0.05元,另一件0.01元,如果用基本数据类型浮点型,用户在实际支付时可能会不成功。

测试二

1
2
3
4
5
6
7
@Test
public void test2()
{
BigDecimal b1 = new BigDecimal(0.05);
BigDecimal b2 = new BigDecimal(0.01);
System.out.println(b1.add(b2));
}

运行结果:

1
0.06000000000000000298372437868010820238851010799407958984375

与上述情况类似。

测试三

1
2
3
4
5
6
7
@Test
public void test3()
{
BigDecimal b1 = new BigDecimal("0.05");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.add(b2));
}

运行结果:

1
0.06

分析:用BigDecimal的String构造器达到了预期结果。故商业中一定要用BigDecimal的String构造器。

附加:BigDecimal的工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package net.zzqd.mmall.util;

import java.math.BigDecimal;

/**
* @author zqnh
* @date 2019/7/28 on 21:43.
*/
public class BigDecimalUtil
{
private BigDecimalUtil()
{
//私有构造器,不允许实例化
}
//加法
public static BigDecimal add(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
//减法
public static BigDecimal sub(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
//乘法
public static BigDecimal mul(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
//除法
public static BigDecimal div(double v1,double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留两位小数

//除不尽的情况
}
}