• Java的加减乘除运算


    作为Java初学者,在学习了基本数据类型之后,大哥给我布置了作业,内容如下:

      计算题:假如今天逛超市花了99.99 请用加减乘除,进行计算得到99.99这个结果。
      要求:1,4个方法;

            2,数值随意编写;

            3,数值要用到int、long、float、double四种类型;

         4,都是返回值,实例化后打印。

      一开始,我建了4个类,按照加减乘除的拼音分别命名为jia、jian、cheng、chu,代码如下所示。

     1 public class jia {  //加法
     2         int a = 10;
     3         long b = 35;
     4         float c = 36.95f;
     5         double d = 18.04;
     6           public void jiafa() {        
     7                 double jia =a + b + c + d;
     8                 System.out.println("加法运算结果是:" + jia);
     9           }
    10 }
     1 public class jian {  //减
     2         long a = 300;
     3         int b = 18;
     4         float c = 128.7f;
     5         double d = 53.31;
     6             public void jianfa() {
     7                 float jian = (float)(a - b - c - (double)d);
     8                 System.out.println("减法运算结果是:" + jian);
     9             }
    10 }
    1 public class cheng {    //乘法
     2     int a = 1;
     3     long b = 1000000;
     4     float c = 0.000001f;
     5     double d = 99.99;
     6             public void chengfa() {
     7                 double cheng = a * b * c * d;
     8                 System.out.println("乘法运算结果是:" + cheng);
     9          }
    10 }
     1 public class chu {    //除法
     2     int a = 1000;
     3     long b = 1000000;
     4     float c = 0.001f;
     5     double d = 99.99;
     6             public void chufa() {
     7               float chu = (float)((double)d/(a/b/c));
     8               System.out.println("除法运算结果是:" + chu);    
     9             }
    10 }

    然后,新建一个类,命名为yunsuan,将上述四则运算实例化并输出结果,代码如下:

     1 public class yunsuan {
     2     public static void main(String[] args) {
     3         jia jiafa = new jia();           //实例化加法
     4         jian jianfa = new jian();        //实例化减法
     5         cheng chengfa = new cheng();     //实例化乘法
     6         chu chufa = new chu();           //实例化除法
     7          
     8         jiafa.jiafa();   //调用加法方法
     9         jianfa.jianfa();
    10         chengfa.chengfa();
    11         chufa.chufa();
    12     }
    13 }

    运行结果如下图:

      除了乘法之外,其他的运算都没有得到我想要的99.99这个结果,这是为什么呢?

      经过讲解和查阅资料之后,原来浮点数是不适合精确计算的,原因是计算机里面数的计算都是二进制计算的,我们其实输入的十进制数,有些十进制数转换成二进制是可以精确转换,而有些转换则不是精确转换,得到的是一个最靠近它的数,所以这里面就存在一个误差。另外,如果浮点数不进行计算时,在十进制里面浮点数能正确显示,如果浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可而知,变得不可逆。

      那么要想使得到的结果精确,可以使用Java DecimalFormat 类,用于格式化十进制数字。

      用法: 

    import java.text.DecimalFormat;
    
    double pi = 3.1415926; DecimalFormat form
    = new DecimalFormat("#.00"); // #.00 表示两位小数 #.0000四位小数 以此类推

      也可以使用Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

      用法:

    import java.math.BigDecimal;
    
    double a = 3.1516;
    BigDecimal b = new BigDecimal(Double.toString(a));

      以加法为例,我们可以用BigDecimal求值,代码示例如下:

    1 import java.math.BigDecimal;
    2 
    3 BigDecimal b1 = new BigDecimal(Double.toString(a));
    4 BigDecimal b2 = new BigDecimal(Double.toString(b));
    5 BigDecimal b3 = new BigDecimal(Double.toString(c));
    6 BigDecimal b4 = new BigDecimal(Double.toString(d));
    7 
    8 double a= b1.add(b2).add(b3).add(b4).doubleValue();

      这里还要注意的是,除法得到的结果是Infinity,这是因为整型和整型相除,得到的仍然是整型;a = 100,b = 1000,a/b 应该等于0.001,实际上得到的是0.0,由于0不能做除数,因此得到的值是无效的,因此就需要Java数值之间的强制转换强制转换是将需要转换的数值转换为需要的类型。

    1 float chu = (float)((double)d4/(a4/b4/c4));           //错误写法
    2 float chu = (float)((double)d4/((float)a4/(float)b4/c4)); //正确写法 

      经过深入理解,将以上代码整合到一个yunsuan的文件里,代码如下:

     1 import java.text.DecimalFormat;
     2 
     3 public class yunsuan {
     4     public void jiafa(){
     5         int a1 = 10;
     6         long b1 = 35;
     7         float c1 = 36.95f;
     8         double d1 = 18.04;
     9         
    10         DecimalFormat form = new DecimalFormat("#.00");//保留两位小数
    11         double jia =a1 + b1 + c1 + d1;
    12         System.out.println("加法运算结果是:" + form.format(jia));
    13     }
    14     public void jianfa(){
    15         long a2 = 300;
    16         int b2 = 18;
    17         float c2 = 128.7f;
    18         double d2 = 53.31;
    19         
    20         DecimalFormat form = new DecimalFormat("#.00");//保留两位小数
    21         float jian = (float)(a2 - b2 - c2 - (double)d2);
    22         System.out.println("减法运算结果是:" + form.format(jian));
    23     }
    24     public void chengfa() {
    25         int a3 = 1;
    26         long b3 = 1000000;
    27         float c3 = 0.000001f;
    28         double d3 = 99.99;
    29         
    30         double cheng = a3 * b3 * c3 * d3;
    31         System.out.println("乘法运算结果是:" + cheng);
    32     }
    33     public void chufa() {
    34         int a4 = 1000;
    35         long b4 = 1000000;
    36         float c4 = 0.001f;
    37         double d4 = 99.99;
    38 
    39         float chu = (float)((double)d4/((float)a4/(float)b4/c4));
    40         System.out.println("除法运算结果是:" + chu);
    41     }
    42     
    43     public static void main(String[] args) {
    44         yunsuan jiafa = new yunsuan();    //实例化
    45         yunsuan jianfa = new yunsuan();
    46         yunsuan chengfa = new yunsuan();
    47         yunsuan chufa = new yunsuan();
    48         
    49         jiafa.jiafa();
    50         jianfa.jianfa();
    51         chengfa.chengfa();
    52         chufa.chufa();
    53     }
    54 }

      亲测全部为99.99,结果正确。

  • 相关阅读:
    TestNg线程池配置、执行次数配置、超时配置
    testng.xml文件结构组成及节点属性说明
    ReportNg 测试报告的定制修改【转】
    TestNg依赖详解(三)------灵活的文件配置依赖
    TestNg依赖高级用法之强制依赖与顺序依赖------TestNg依赖详解(二)
    TestNg依赖配置基础用法(单一方法依赖)------TestNg依赖详解(一)
    compareTo,Comparator和equals
    HashMap源码解析
    redis的相关知识
    IO模型
  • 原文地址:https://www.cnblogs.com/luckyliulin/p/7862802.html
Copyright © 2020-2023  润新知