BigDecimal使用常见误区

使用误区一:初始化

Java代码   收藏代码
  1. System.out.println(new BigDecimal("0.03"));  
  2. System.out.println(new BigDecimal(3));  
  3. System.out.println(new BigDecimal(0.03));  
  4.   
  5. System.out.println(BigDecimal.valueOf(3L));  
  6. System.out.println(BigDecimal.valueOf(0.03));  
  7. System.out.println(BigDecimal.valueOf(0.03f));  

 

上述你能准确说出运行结果么?

Java代码   收藏代码
  1. 0.03  
  2. 3  
  3. 0.0299999999999999988897769753748434595763683319091796875  
  4. 3  
  5. 0.03  
  6. 0.029999999329447746  

 

原理分析

最常用的标准构造器为:

Java代码   收藏代码
  1. public BigDecimal(String val);  

另一个也基本一致:   

Java代码   收藏代码
  1. public static BigDecimal valueOf(double val) {  
  2.         return new BigDecimal(Double.toString(val));  
  3.     }  

其他构造器使用不小心的话就可能产生问题,这块后续对java中的数值类型精度方面做个细致的学习和整理。

BigDecimal.valueOf(0.03f)这个数值不符合预期是float转double的时候丢失精度了,跟BigDecimal无关。

 

 

使用误区二:比较

Java代码   收藏代码
  1. BigDecimal a = new BigDecimal("1.23");  
  2. BigDecimal b = new BigDecimal("1.230");  
  3. System.out.println(a.equals(b)); //false  

结果竟不是预期的true。

原理分析 

equals是比较内容,自然不一样。BigDecimal的比较要用compareTo

Java代码   收藏代码
  1. System.out.println(a.compareTo(b)); //0表示相等  

 

 

使用误区三:运算 

Java代码   收藏代码
  1. BigDecimal c = new BigDecimal("1.23");  
  2. BigDecimal d = new BigDecimal("1.23");  
  3. c.add(d);  
  4. System.out.println(c);  

 结果是2,46么?

显然不是,仍然是1.23

 

原理分析

BigDecimal加减乘除最终都返回的是一个新的BigDecimal对象,c.add(d);虽然做了加法操作,但是c并没有保存加操作后的值,正确的用法应该是c=c.add(d)。

 

 

使用误区四:除不尽

 

Java代码   收藏代码
  1. System.out.println(new BigDecimal("100").divide(new BigDecimal("12")));  
 结果直接抛异常了。
异常 如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

 

原理分析

BigDecimal的除法要养成习惯去设置精度,以免出现无限循环小数而抛异常。

 

Java代码   收藏代码
  1. new BigDecimal("100").divide(new BigDecimal("12").setScale(2, BigDecimal.ROUND_HALF_DOWN)  

 这样写对么?wrong,正确写法如下:

Java代码   收藏代码
  1. new BigDecimal("100").divide(new BigDecimal("12"),2, BigDecimal.ROUND_HALF_DOWN);  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值