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类型赋值,出现精度误差。
浙公网安备 33010602011771号