Java中BigDecimal的加减乘除,比较大小与使用注意事项

  

  

借用《Effactive Java》这本书中的话,浮点数和双精度数类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,在Java里面,int的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了BigDecimal,关于BigDecimal的介绍有很多,需要了解的朋友可以参考这篇文章:https://www.jb51.net/article/55395.htm

  


  

        bignum1=new BigDecimal (“10”);   bignum2=new BigDecimal (“5”);   BigDecimal bignum3=零;//加法   bignum3=bignum1.add (bignum2);   system . out。println(“和是:“+ bignum3);//减法   bignum3=bignum1.subtract (bignum2);   system . out。println(“差是:“+ bignum3);//乘法   bignum3=bignum1.multiply (bignum2);   system . out。println(“积是:“+ bignum3);//除法   bignum3=bignum1.divide (bignum2);   system . out。println(“商是:“+ bignum3);之前      

运行结果为:

  

 Java中BigDecimal的加减乘除,比较大小与使用注意事项“> <br/>
  </p>
  <p> </p>
  
  <pre类=   num1=new BigDecimal (“0”);   num2=new BigDecimal (" 1 ");   num3=new BigDecimal (“2”);      num=new BigDecimal (" 1 ");//用做比较的值      System.out.println (num1.compareTo (num));//小于时,返回1   System.out.println (num2.compareTo (num));//等于时,返回0   System.out.println (num3.compareTo (num));//大于时,返回1      

这是输出结果:

  

 Java中BigDecimal的加减乘除,比较大小与使用注意事项

  

解释下注释里面了。

  

<>强补充:
  

  先导入BigInteger也

可以存放比较大的数,和BigDecimal的区别是:BigInteger存放的是大的整数,而BigDecimal存放大的小数

  

继续补充一下,用BigDecimal写个的循环。

        (我=new BigDecimal (“0”);i.compareTo(新BigDecimal (10)) !=1;我=我。添加(新BigDecimal (" 1 "))) {   system . out。打印(i +“t \”);   }      

控制台打印的是从0到10。

  

  

<强> 1. bigdecial是不可变的,就像弦一样,它的所有操作都会生成一个新的对象,所以

        量。添加(thisAmount);      

是错误的,而应该是:

        数量=L砑?thisAmount);      

<强> 2。不要用=方法来比较BigDecimal对象,因为它的=方法会比较,如果规模不一样,它会返回假;

  

例如:         一个=new BigDecimal (" 2.00 ");   b=new BigDecimal (" 2.0 ");   print (a.equals (b));//错误      

所以你应该使用compareTo()和符号()方法

        a.compareTo (b);//返回(1如果& lt;b),如果==b(0),(1)如果一个比;b)   a.signum ();//返回(1如果& lt;0),(如果一个==0),(1)如果一个比;0)      

<强> 3。使用BigDecimal的字符串构造函数,不要使用双参数的构造函数,否则的话会出现你不想要的结果。
  

  

例如下面的代码分别使用双和字符串的构造函数,然后使用HALF_EVEN的圆方法,但是输出结果不一样:

        System.out.println (“==================");   for (int i=0;我& lt;10;我+ +){   StringBuffer某人=new StringBuffer ();   sb.append (“0”);   sb.append(我);   sb.append (“5”);   bdx=new BigDecimal (sb.toString ());   system . out。println(某人+ " " + bdx。RoundingMode.HALF_EVEN setScale (1));   }      System.out.println (“==================");   for (int i=0;我& lt;10;我+ +){   StringBuffer某人=new StringBuffer ();   sb.append (“0”);   sb.append(我);   sb.append (“5”);   bdx=new BigDecimal (Double.valueOf (sb.toString ()));   system . out。println(某人+ " " + bdx。RoundingMode.HALF_EVEN setScale (1));   }      

输出是:
  

     ==================0.05 - 0.0   0.15 - 0.2   0.25 - 0.2   0.35 - 0.4   0.45 - 0.4   0.55 - 0.6   0.65 - 0.6   0.75 - 0.8   0.85 - 0.8   0.95 - 1.0==================0.05 - 0.1   0.15 - 0.1   0.25 - 0.2   0.35 - 0.3   0.45 - 0.5   0.55 - 0.6   0.65 - 0.7   0.75 - 0.8   0.85 - 0.8   0.95 - 0.9

Java中BigDecimal的加减乘除,比较大小与使用注意事项