zoukankan      html  css  js  c++  java
  • 01实验性问题总结归纳

    信1603    马雯秋

    01-JAVA语言基础

    课程中动手动脑的问题以及课后实验性的问题的总结归纳

    问题一、运行TestDouble.java

    源代码:

    public class TestDouble {

        public static void main(String args[]) {

            System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));

            System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));

            System.out.println("4.015 * 100 = " + (4.015 * 100));

            System.out.println("123.3 / 100 = " + (123.3 / 100));

        }

    }

    运行结果:

    0.05 + 0.01 = 0.060000000000000005

    1.0 - 0.42 = 0.5800000000000001

    4.015 * 100 = 401.49999999999994

    123.3 / 100 = 1.2329999999999999

    结论:使用double类型的数值进行计算,其结果是不精确的。

    原因分析:

    (涉及浮点数在计算机内部的表示方法)

    计算机并不能识别除了二进制数据以外的任何数据,无论我们使用何种编程语言,都要先 把源程序翻译成二进制的机器码后才能被计算机识别。浮点数由两部分组成:指数和尾数。如果在这个转换的过程中,浮点数参与了计算,那么转换的过程就会变得不可逆,就是在这个过程中,发生了精度的丢失。但是有些浮点计算会得到准确的结果,应该也是碰巧那个计算的二进制与 十进制之间能够准确转换。而当输出单个浮点型数据的时候,可以正确输出,如

    double d = 2.4;
    System.out.println(d);

    输出的是2.4,而不是2.3999999999999999。也就是说,不进行浮点计算的时候,在十进制里浮点数能正确显示。浮点数并不适合用于精确计算,而适合进行科学计算。

    解决方法:使用BigDecimal类

    源代码:

    import java.math.BigDecimal;

    public class TestBigDecimal

    {

           public static void main(String[] args)

           {

                  BigDecimal f1 = new BigDecimal("0.05");

                  BigDecimal f2 = BigDecimal.valueOf(0.01);

                  BigDecimal f3 = new BigDecimal(0.05);

                  System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");

                  System.out.println("0.05 + 0.01 = " + f1.add(f2));

                  System.out.println("0.05 - 0.01 = " + f1.subtract(f2));

                  System.out.println("0.05 * 0.01 = " + f1.multiply(f2));

                  System.out.println("0.05 / 0.01 = " + f1.divide(f2));

                  System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");

                  System.out.println("0.05 + 0.01 = " + f3.add(f2));

                  System.out.println("0.05 - 0.01 = " + f3.subtract(f2));

                  System.out.println("0.05 * 0.01 = " + f3.multiply(f2));

                  System.out.println("0.05 / 0.01 = " + f3.divide(f2));

           }

    }

    运行结果:

    下面使用String作为BigDecimal构造器参数的计算结果:

    0.05 + 0.01 = 0.06

    0.05 - 0.01 = 0.04

    0.05 * 0.01 = 0.0005

    0.05 / 0.01 = 5

    下面使用double作为BigDecimal构造器参数的计算结果:

    0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125

    0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125

    0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125

    0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125

    问题提出:在构建BigDecimal对象使应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。为什么会这样?

    原因分析:

    double不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用 BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算 符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

    问题二、以下代码的输出结果是什么?

    public class TestBigDecimal

    {

           public static void main(String[] args)

           {

                  int X=100;

                  int Y=200;

                  System.out.println("X+Y="+X+Y);

                  System.out.println(X+Y+"=X+Y");

           }

    }

    运行结果:

    X+Y=100200

    300=X+Y

    原因分析:

    加号只有在两个string类型或者其中一个是string类型的时候才起到连接作用,否则仍然是运算符。

    在System.out.println()中,如果在string字符串后面是+和变量,会把变量转换成string类型,加号起连接作用,然后把两个字符串连接成一个新的字符串输出(如"X+Y="+X+Y);如果先有变量的加减运算再有字符串,那么会从左到右先计算变量的加减,然后再与后面的string结合成一个新的字符串(如X+Y+"=X+Y")。

    课堂练习三、在一个对话框中显示文本

    源代码:

    import javax.swing.JOptionPane;  // import class JOptionPane

    public class Welcome2 {

       public static void main( String args[] )

       {

          JOptionPane.showMessageDialog(

             null, "Welcome\nto\nJava\nProgramming!" );

          System.exit( 0 );  // terminate the program

       }

    }

    运行结果:

     

    课堂练习四、运行JavaAppArguments.java

    源代码:运行结果

    public class JavaAppArguments {

           public static void main(String[] args) {

                  System.out.println("参数个数:"+args.length);

                  for (String arg : args) {

                         System.out.println(arg);

                  }

           }

    }

    运行结果:

    参数个数:0

    程序分析:

    在main方法运行时会传入一个默认但是没有初始化的字符串数组,所以args.length=0。

  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/wenqiu1998/p/7629141.html
Copyright © 2011-2022 走看看