JAVA课后作业01

一.关于枚举的问题

public class EnumTest {

	public static void main(String[] args) {
		Size s=Size.SMALL;
		Size t=Size.MEDIUM;
		//s和t引用同一个对象?
		System.out.println(s==t);  //false
		//是原始数据类型吗?
		System.out.println(s.getClass().isPrimitive());//false
		//从字符串中转换
		Size u=Size.valueOf("SMALL");
		System.out.println(s==u);  //true
		//列出它的所有值
		for(Size value:Size.values()){
			System.out.println(value);
		}
	}
}
 enum Size{SMALL,MEDIUM,LARGE};

   1.运行下列代码可得注释后的结果,由此可以看出枚举的每个具体值都引用一个特定的对象,当引用的都为SMALL时,结果为true,则相同的值则引用同一个对象;

   2.第二显示表示枚举并不属于八个原始数据类型,是属于引用类型;

   3.第三个表示在枚举中可以直接使用“==”和equals()方法直接对比;

二.原码、补码,反码以及JAVA中数值采用哪种码表示

   1.原码定义(摘自百度百科):一种计算机中对数字的二进制定点表示方法,原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1,

     举例:2->00000010,-2->10000010,+0->00000000,-0->10000000;

    小数的原码:对十进制小数乘以2得到的整数部分和小数部分,整数部分即是相应的二进制数码,再用2乘小数部分,结果再取整数部分,如此反复,直到小数部分为0或达到精度为止。第一次得到的为最高位,最后一次得到为最低位。

   2.补码(摘自百度百科):在计算机系统中,数值一律用补码来表示和存储

    举例(二进制):整数补码(正整数补码与原码相同)  +9的补码是00001001,负数补码   -5:11111011(求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1)

         数0的补码表示是唯一的:00000000

         小数的补码:正数的补码与原码相同,负数的补码规则与负整数相同,举例:0.1011为正数,补码与原码真值一致。仍为0.1011,-0.0101为负数,补码为1.1011

   3.反码(二进制):正数反码:正数的反码与原码相同。负数:负数的反码,符号位为“1”,数值部分按位取反。举例:7-> 0 0000111 ,-7-> 1 1111000

   4.首先先猜想是由原码表示,程序验证

1         int a=1;
2         int b=-1;
3         int sum=a+b;
4         System.out.println(sum);

      可知程序的结果为0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错,故java中数值并非是由原码储存

      同理,在使用反码表示时,也会出现同样的问题: (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 )

      而在补码中这没有这个问题:(00000001)补 + (11111111)补 = (00000000)补 = ( 0 )

      所以在java中,数值是由补码表示的

三.java中数值进行运算为什么得不到数学上精确

   运行以下代码:

   得到结果:

   可见,double类型在进行运算时并不能达到数学上的精确。原因是我们的计算机是二进制的,浮点数没有办法是用二进制进行精确表示的,CPU在表示浮点数是由两个部分表示的:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。

   所以在Java中的数值运算只能用于科学计算或是工程计算,在大多数的商业计算中,一般所采用java.math.BigDecimale类来进行精确计算。

步骤如下:

  1)将double类型转换成string类型

  2)将string类型转换成BigDecimal对象

  3)使用BigDecimal对象的方法如add等进行加减乘除运算。

四.输出结果显示问题

运行以下代码:

1         int x=100;
2         int y=200;
3         System.out.println("x+y="+x+y);
4         System.out.println(x+y+"=x+y");

程序结果为:

原因:在Java中,+有时是运算符,有时是连接符

  1)当左右两边连接的都是非数字型时,则为连接符。

  2)当一边是数值类型,另一边是非数值类型时,则为连接符。

  3)当两边都是数值类型时,则为运算符,即相加求和的作用。

猜你喜欢

转载自www.cnblogs.com/heiyang/p/9745909.html