BIGDECIMAL用于实现浮点数的精确计算

//用于实现浮点数的精确计算
//****
//import java.util.Scanner;
import java.math.BigDecimal;

// 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精

// 确的浮点数运算,包括加减乘除和四舍五入。
//在BigDecimal中只能用String来构造



public class Arith{

   //默认除法运算精度

    privatestatic final int DEF_DIV_SCALE = 10;

   //这个类不能实例化

    privateArith(){

    }



    //提供精确的加法运算。

     //@param v1 被加数

    //@param v2 加数

    //@return 两个参数的和



    publicstatic double add(double v1,double v2){

       BigDecimal b1 = new BigDecimal(Double.toString(v1));

       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       return b1.add(b2).doubleValue();

    }



     //提供精确的减法运算。

     //@param v1 被减数

     //@param v2 减数

     //@return 两个参数的差




public static double sub(double v1,double v2){

       BigDecimal b1 = new BigDecimal(Double.toString(v1));

       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       return b1.subtract(b2).doubleValue();

    }



     //提供精确的乘法运算。

    //@param v1 被乘数

    //@param v2 乘数

   // @return两个参数的积



    publicstatic double mul(double v1,double v2){

       BigDecimal b1 = new BigDecimal(Double.toString(v1));

       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       return b1.multiply(b2).doubleValue();

    }



   //提供(相对)精确的除法运算,当发生除不尽的情况时,精确到

   //小数点以后10位,以后的数字四舍五入。

   //@paramv1 被除数

  //@param v2 除数

  //@return 两个参数的商




public static double div(double v1,double v2){

       return div(v1,v2,DEF_DIV_SCALE);

    }



    //提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指

   //定精度,以后的数字四舍五入。

  //@param v1 被除数

  //@param v2 除数

  // @param scale表示表示需要精确到小数点以后几位。

  // @return 两个参数的商



    publicstatic double div(double v1,double v2,int scale){

       if(scale<0){

           throw new IllegalArgumentException(

               "只能为整数或0(The scale must be a positive integer or zero)");

       }

       BigDecimal b1 = new BigDecimal(Double.toString(v1));

       BigDecimal b2 = new BigDecimal(Double.toString(v2));

       returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

    }



    //提供精确的小数位四舍五入处理。

    //@param v 需要四舍五入的数字

   //@paramscale 小数点后保留几位

  // @return 四舍五入后的结果



    publicstatic double round(double v,int scale){

       if(scale<0){

           throw new IllegalArgumentException(

               "The scale must be a positive integer or zero");

       }

       BigDecimal b = new BigDecimal(Double.toString(v));

       BigDecimal one = new BigDecimal("1");

       returnb.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

    }
    publicstatic void main(String [] args) {
        Scanner input = new Scanner(System.in);
   Arith arith = newArith();
   boolean isExit = true;
   while(isExit) {
        System.out.println("这里有以下几种运算,请你选择你要的运算:\n"
                    +"1.加法\n2.减法\n3.乘法\n4.除法\n5.指定小数点位数的除法\n6.把数字精确到指定位数");
       int choose = input.nextInt();
 
    switch(choose) {
         case 1 :
       System.out.println("你选择了加法运算!");
     System.out.print("请输入你的第一个数:");
     doublev1 = input.nextDouble();
     System.out.print("请输入你的第二个数:");
     doublev2 = input.nextDouble();
     System.out.println(arith.add(v1,v2));
     break;
    case2 :
       System.out.println("你选择了减法运算!");
     System.out.print("请输入你的第一个数:");
     doublev3 = input.nextDouble();
     System.out.print("请输入你的第二个数:");
     doublev4 = input.nextDouble();
     System.out.println(arith.sub(v3,v4));
     break;
    case3 :
       System.out.println("你选择了乘法运算!");
     System.out.print("请输入你的第一个数:");
     doublev5 = input.nextDouble();
     System.out.print("请输入你的第二个数:");
     doublev6 = input.nextDouble();
     System.out.println(arith.mul(v5,v6));
     break;
    case4 :
       System.out.println("你选择了除法运算!");
     System.out.print("请输入你的第一个数:");
     doublev7 = input.nextDouble();
     System.out.print("请输入你的第二个数:");
     doublev8 = input.nextDouble();
     System.out.println(arith.div(v7,v8));
     break;
      case 5 :
       System.out.println("你选择了指定位数的除法运算!");
     System.out.print("请输入你的第一个数:");
     doublev9 = input.nextDouble();
     System.out.print("请输入你的第二个数:");
     doublev10 = input.nextDouble();
     System.out.print("请输入保留小数点的位数:");
     intscale = input.nextInt();
     System.out.println(arith.div(v9,v10,scale));
     break;
    case6 :
       System.out.println("你选择了把数字精确到指定位数运算!");
     System.out.print("请输入你的第一个数:");
     doublev11 = input.nextDouble();
     System.out.print("请输入保留小数点的位数:");
     intscale1 = input.nextInt();
     System.out.println(arith.round(v11,scale1));
     break;
    default:
      System.out.println("没有你所要的选择算法");    
    }
    System.out.print("你是否需要重新进行下次计算(y/n)");
    String check = input.next();
    if(check.equalsIgnoreCase("n")) {
    isExit = false;
    break;
  }
  }
  }
}

猜你喜欢

转载自357029540.iteye.com/blog/2203531
今日推荐