BigDecimal解决浮点型运算中丢失精度的问题



BigDecimal在浮点型数据计算丢失精度的常见案例:

  1. package com.mmall.test;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. import java.math.BigDecimal;  
  6.   
  7. /* 
  8.   Created by jia 
  9.  /  
  10. public class BigDecimalTest {  
  11.   
  12.     //和想象不太一样,很容易丢失精度  
  13.     //很多语言都有专门的货币计算,java没有  
  14.     //java在浮点型运算过程中会丢失精度  
  15.     //很可能造成一个用户有10元钱不能购买9.9999元的商品  
  16.     @Test  
  17.     public void test1(){  
  18.         System.out.println(0.05+0.01);  
  19.         System.out.println(1.0+0.42);  
  20.         System.out.println(4.015100);  
  21.         System.out.println(123.3/100);  
  22.         / 
  23.         0.060000000000000005 
  24.         1.42 
  25.         401.49999999999994 
  26.         1.2329999999999999 
  27.          /  
  28.   
  29.     }  
  30.   
  31.     @Test  
  32.     public void test2(){  
  33.         BigDecimal b1 = new BigDecimal(0.05);  
  34.         BigDecimal b2 = new BigDecimal(0.01);  
  35.         //b1.add(b2);  
  36.         System.out.println(b1.add(b2));  
  37.         //0.06000000000000000298372437868010820238851010799407958984375  
  38.         //又长又乱  
  39.     }  
  40.   
  41.     @Test  
  42.     public void test3(){  
  43.         BigDecimal b1 = new BigDecimal(“0.05”);  
  44.         BigDecimal b2 = new BigDecimal(“0.01”);  
  45.         System.out.println(b1.add(b2));  
  46.         //0.06  
  47.         //用string 构造器,完美解决  
  48.     }  
  49. }  
通过上面的测试可知,使用BigDecimal的string构造器,可以完美解决这个问题。

下面封装一个BigDecimalUntil工具类,方便以后使用:

  1. package com.mmall.until;  
  2.   
  3. import java.math.BigDecimal;  
  4.   
  5. /* 
  6.   Created by jia 
  7.  */  
  8. public class BigDecimalUntil {  
  9.   
  10.     //使构造器不能在外部实例化  
  11.     private BigDecimalUntil(){  
  12.   
  13.     }  
  14.   
  15.     public static BigDecimal add(double v1,double v2){  
  16.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  17.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  18.         return b1.add(b2);  
  19.     }  
  20.   
  21.     public static BigDecimal sub(double v1,double v2){  
  22.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  23.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  24.         return b1.subtract(b2);  
  25.     }  
  26.   
  27.     public static BigDecimal mul(double v1,double v2){  
  28.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  29.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  30.         return b1.multiply(b2);  
  31.     }  
  32.   
  33.     public static BigDecimal div(double v1,double v2){  
  34.         BigDecimal b1 = new BigDecimal(Double.toString(v1));  
  35.         BigDecimal b2 = new BigDecimal(Double.toString(v2));  
  36.         return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);  
  37.         //除不尽的时候要四舍五入,并且保留几位小数  
  38.     }  
  39. }  



猜你喜欢

转载自blog.csdn.net/trust_kobebryant/article/details/80821996