本文概览:介绍BigDecimal的作用、相关的一些使用
1 引入
BigDecimal是为了实现进行dubbo和long的数值运算引入的。如下代码
1 2 3 4 5 |
public static void main(String[] args) { System.out.println(0.06+0.01); System.out.println(4.015*100); System.out.println(303.1/1000); } |
返回结果为:
0.06999999999999999
401.49999999999994
0.30310000000000004
发现与预想的结果不一样,此时引入了BigDecimal。
2 相关使用
2.1 equals和compareTo
比较是否相等使用compareTo来实现
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 |
public static void main(String[] args){ BigDecimal a = new BigDecimal("0.00"); BigDecimal b = new BigDecimal("000000"); // 测试equals if( !a.equals(b) ){ System.out.println("equals:0.00!=000000"); }else { System.out.println("equals:0.00==000000"); } // 测试compareTo if(0 != a.compareTo(b) ){ System.out.println("compareTo:0.00!=000000"); }else { System.out.println("compareTo:0.00==000000"); } } |
返回结果为
equals:0.00!=000000
compareTo:0.00==000000
2.2 判断等于0
1 方法1 通过BigDecimal.ZERO和compareTo方法来实现:
1 2 |
new BigDecimal( "0" ).compareTo( BigDecimal.ZERO) == 0 // true new BigDecimal( "0.00" ).compareTo( BigDecimal.ZERO) == 0 // true |
2. 方法2 通过signum方法来实现
1 2 3 4 |
BigDecimal bigDecimal = new BigDecimal(number); if (0 == bigDecimal.signum()) { throw new RuntimeException("持仓文件中金额不能为0"); } |
2.3 除法divide
1. 解析scale和roundingModel参数含义
1 |
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) |
(1)scale 小数点后几位
(2)roundingModel 保留位后面小数舍去的方式,
- BigDecimal.ROUND_DOWN 直接舍去
- BigDecimal.ROUND_UP 直接向上进位向上取整。如1.1处理后是2;-1.1处理后是-2
- BigDecimal.ROUND_HALF_UP 四舍五入
2. 对于结果打印要注意两点
- BigDecimal#longValue() 对结果进行取整。
- BigDecimal#toString()打印真正值的字符串
- 代码如下
12345678910111213public class Test {public static BigDecimal incomeCal(int corpus){BigDecimal incomePerDayBigDecimal =new BigDecimal(corpus).divide(new BigDecimal(3),2, BigDecimal.ROUND_UP);return incomePerDayBigDecimal;}public static void main(String args[]){BigDecimal income = Test.incomeCal(20);System.out.println("1/3="+income.toString());System.out.println("转成long为:"+income.longValue());}}
结果为:
1/3=6.67
转成long为:6
3 最佳实践
3.1 小数相关操作
当需要使用小数构造一个BigDecimal时,建议使用
1 2 |
String worth = "1.22" BigDecimal data = new BigDecimal(worth); |
一定要谨慎使用Double/double作为参数构建BigDecimal,如下
1 2 |
Double worth = 1.22; BigDecimal data = new BigDecimal(worth); |
两种方式造成结果如下:
1 2 3 4 5 6 7 8 9 10 11 |
public static void main(String[] args) { BigDecimal data = new BigDecimal("2"); Double d = 2.3232; // 转成String BigDecimal valueWithString = data.multiply(new BigDecimal(d.toString())); System.out.println("valueWithString=" + valueWithString.toString()); // 不转String,会使用精度 BigDecimal valueWithBigDecimal = data.multiply(new BigDecimal(d)); System.out.println("valueWithBigDecimal=" + valueWithBigDecimal.toString()); } |
执行结果为,显然第二种结果不是我们想要的结果。
1 2 |
valueWithString=4.6464 valueWithBigDecimal=4.6463999999999998635757947340607643127441406250 |
(全文完)