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。

  • 相关阅读:
    MySQL 报错记录
    Python连接MySQL
    Linux-mail设置
    样式学习--参照Oracle写法
    Shell的for和select
    Shell 定时发送邮件检查网站脚本/邮件正文
    Linux之 AWK SED
    MySQL excel导入
    《iOS三问》 -- 从动画系统的实现谈iOS核心动画

  • 原文地址:https://www.cnblogs.com/wenqiu1998/p/7629141.html
Copyright © 2011-2022 走看看