Java动手动脑作业

动手动脑Ⅰ

两数相加

动脑动手Ⅱ

动脑动手Ⅲ

动手实验

 

动手动脑Ⅰ

一:java中isPrimitive()是说:确定指定的Class对象是基本类型,其返回是个boolean值,true代表你指定的这个Class对象是基本类型,false代表这个Class对象不是基本类型。
二:数据的基本类型有char int byte short long float double boolean
三:Java中getClass()方法, Java中的getClass()方法是Object类中的方法,用于返回一个对象所属的类的Class对象。
四:代码解析
 1 public class Main {
 2     Scanner sc=new Scanner(System.in);
 3     public enum Size{SMALL,MEDIUM,LARGE};
 4     public static void main(String[] args) {
 5         Size s=Size.SMALL;
 6         Size t=Size.LARGE;
 7         System.out.println(s==t); //两个都是枚举类对象,可以应用==,但是两者不相同返回false
 8         System.out.println(s.getClass().isPrimitive());//判断是否是基本数据类型,是枚举型,反回false
 9         Size u=Size.valueOf("SMALL");
10         System.out.println(s==u);  //true两者相等
11         for(Size value:Size.values()){
12             System.out.println(value);//里边有三个数据,所以输出了三个数据。
13         }
14     }
15 }
输出:
 

 
五:结论,枚举类型不是基本数据类型,但是可以执行==操作,可以通过for循环或者通过Size.values()[1]来访问里边的值。
ordinal()用于返回成员的索引。compareTo()用于比较枚举类型中两个成员的索引值。
valueOf()用于返回枚举类型中指定字符串对应的枚举成员,如果不存在则抛出异常。
values()方法以数组方式返回枚举类型中的成员。
 
还可以对数据进行初始化自定义。

 1 enum famulei {
 2         /**
 3          * famulei:伐木累
 4          */
 5         ZHANGSAN("male",20), LISI("male",25), WANGWU("female",30);
 6         private String sex;
 7         private int age;
 8         //构造方法
 9         famulei(String sex, int age) {
10             this.sex=sex;
11             this.age=age;
12         }
13  
14         //自定义方法
15         public void setSex(String sex){
16             this.sex=sex;
17         }
18         public void setAge(int age){
19             this.age=age;
20         }
21 }
22  
23 
24  

两数相加

一:Java自带高精度,可以用高精度加法。

 1 public static void main(String[] args) {
 2 
 3 Scanner in=new Scanner(System.in);
 4 
 5 BigInteger a=in.nextBigInteger();
 6 
 7 BigInteger b=in.nextBigInteger();
 8 
 9 BigInteger c=a.add(b);
10 
11 System.out.println(c);
12 
13 }

 

二:java中parseInt()方法Integer.parseInt(String)的作用就是将String字符类型数据转换为Integer整型数据。

三:代码解析

 1 public static void main(String[] args) {
 2     String firstNumber,   // first string entered by user
 3             secondNumber;  // second string entered by user
 4     int number1,          // first number to add
 5             number2,          // second number to add
 6             sum;              // sum of number1 and number2
 7 
 8     // read in first number from user as a string
 9     firstNumber =
10             JOptionPane.showInputDialog( "Enter first integer" );//读入第一个字符串
11 
12     // read in second number from user as a string
13     secondNumber =
14             JOptionPane.showInputDialog( "Enter second integer" );//读入第二个字符串
15 
16     // convert numbers from type String to type int
17     number1 = Integer.parseInt( firstNumber );//第一个字符串转化为整数对象
18     number2 = Integer.parseInt( secondNumber );//第二个字符串转化为整数对象
19 
20     // add the numbers
21     sum = number1 + number2;//两个整数对象求和
22 
23     // display the results
24     JOptionPane.showMessageDialog(
25             null, "The sum is " + sum, "Results",
26             JOptionPane.PLAIN_MESSAGE );
27 
28     System.exit( 0 );   // terminate the program
29 }

输出:

 

 

 

 

 

 

 

 

 

动脑动手Ⅱ

一:代码解析

输出结果为1,也就是变量在有效区域内有作用,而且忽略其他同名变量的作用域,但是出了自己的作用域,就会失效。

 

动脑动手Ⅲ

一:

 

输出为

二:原因  在执行基本数据类型和字符串相加的运算时,默认是字符串之间的相连接操作,所以第一个输出就是,先连接是100 再连接了200,第二个输出是先运算了100+200=300,然后才与字符串连接。

 

 

 

 

 

动手实验

一:运行代码

运行结果:

结论:用double类型的数值运算时,结果不准确。

 

二:原因

浮点数和双精度浮点数(double)都是计算机中用于表示实数的数据类型。它们采用 IEEE 754 标准,该标准为这两种数据类型定义了一种格式,可以在计算机内存中表示非常大的范围内的数值。IEEE 754 标准的浮点数表示包含三个部分:符号位、指数部分和尾数部分。符号位用于表示正负数,指数部分用于表示数值的范围,尾数部分用于表示数值的精度。

精度损失通常是由于舍入误差引起的。在浮点数运算中,有些实数的小数部分是无限的,例如 1/3 = 0.333333...,但浮点数只能表示有限的小数位数。当进行数值运算时,这些无限的小数部分会被截断,导致舍入误差。另外,浮点数运算还可能受到溢出和下溢的影响。溢出是指运算结果超出了可以表示的数值范围,下溢是指运算结果接近于零,但无法表示为零。这些情况也会导致精度损失。

由于计算机是二进制的,浮点数的这些部分也都是用二进制表示的。其次,由于计算机的存储空间是有限的,所以浮点数在计算机中的表示是近似的,只能精确到一定的位数。当进行浮点数运算时,由于舍入误差的存在,可能会产生精度损失。例如,计算 0.1 + 0.2 会得到 0.30000000000000004,而不是预期的 0.3。在计算机中,0.1和0.2的二进制表示是无限循环的。当计算机尝试将它们相加时,会进行舍入和截断操作,导致结果并不完全等于0.3,而是一个近似值。这种舍入和截断操作导致了精度损失。在浮点数运算中,精度损失通常会随着运算的复杂性和次数的增加而累积。这意味着进行多次浮点数运算时,结果可能与预期的结果有一定的偏差。

根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确。只能无限接近于那个值

 

三:怎样处理精度损失----------高精度

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

 

BigDecimal(int)       创建一个具有参数所指定整数值的对象。 
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long)    创建一个具有参数所指定长整数值的对象。 

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用

 

 

add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。 
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。 
multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。 
divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。 

 

1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法

 

输出结果

 

第一类输出,是对f1进行字符串类型的赋值,然后进行计算,没有精度误差,而直接用的double类型赋值,出现精度误差。

 

 

 

posted on 2023-09-13 13:18  临江柔  阅读(26)  评论(0)    收藏  举报