BigDecimal类精准计算使用

/*
 * 1.java中基础类型数据的溢出问题和c,c++不同,c中出现一处情况的时间,
 *  数据会出现错误但是在java语言中,当出现溢出情况的时间,该变量会变
 *  成自身基础类型能表达的最小值。这一点往往容易忽略,造成错误。
 * 2.下面代码刚好可以说明问题,大致一看,输出应该是50。但是该循环
 *  却是一个无限循环
 */
public class CycUtmost {
   public static void main(String[] args) {
      int end = Integer.MAX_VALUE;
      int start = end - 50;
      int count=0;
      for(int i=start; i<=end; i++) {
          count++;System.out.println(count);
      }

   }
}

因此在遇到数据类型边界问题的时间,需要谨慎对待,或者直接使用java中的BigDecimal类来进行计算。如下:

/*
 * 1.java中的BigDecimal用于精确计算,它可以计算到小数点后任意位,
 *   也就是大数计算,和c,c++不同,java直接给出大数精确计算的类,
 *   可以直接使用
 * 2.定义BigDecimal类,和平时的定义相同,中间可以添加字符串来实
 *  现该对象的构造
 * 3.加减乘除相对应的方法分别为:add() subtract() multiply() divide()
 * 
 * 注意:对于divide方法来说,当碰到无限循环的结果的时间,会出现异常报错,
 *    因此需要在使用时间指定参数来避免出现该问题
 */
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class AccuratelyFloat {
   public static void main(String[] args) {
     BigDecimal sv = new BigDecimal("3");//定义BigDecamil类
     String str = new String();
     Scanner sc = new Scanner(System.in);
     //str = sc.nextLine();
     BigDecimal sv1 = new BigDecimal("10");
     BigDecimal result = sv1.add(sv);//BigDecimal加 减 乘 除 精确计算
     System.out.println(result);
     result = sv1.subtract(sv);
     System.out.println(result);
     result = sv1.multiply(sv);
     System.out.println(result);
     result = sv1.divide(sv,100,BigDecimal.ROUND_HALF_UP);//除数 小数点后几位 四舍五入
     System.out.println(result);
   }
}

实例:输出1+ 1/2! + 1/3! + 1/4! + 1/5! +…..+ 1/n! 的结果,输出精确结果

import java.math.BigDecimal;

public class Example1 {
  public static void main(String[] args) {
    BigDecimal sum = new BigDecimal("1");
    BigDecimal max = new BigDecimal("1");
    BigDecimal i = new BigDecimal("2");
    BigDecimal x = new BigDecimal("1");
    int v=1;
    while( v<20 ) {
       max = max.multiply(i);
       sum = sum.add(x.divide(max,100,BigDecimal.ROUND_HALF_UP));
       i = i.add(x);
       v++;
//     System.out.println("max="+max);
//     System.out.println("sum="+sum);
//     System.out.println("i="+i);
    }
    System.out.println(sum);
  }
}

猜你喜欢

转载自blog.csdn.net/qq_39259536/article/details/81667477