2020.9.29(动手动脑)

枚举

 1 public class EnumTest {
 2     public static void main(String[] args) {
 3         Size s=Size.SMALL;
 4         Size t=Size.LARGE;
 5         //s和t引用同一个对象?
 6         System.out.println(s==t);  //
 7         //是原始数据类型吗?
 8         System.out.println(s.getClass().isPrimitive());
 9         //从字符串中转换
10         Size u=Size.valueOf("SMALL");
11         System.out.println(s==u);  //true
12         //列出它的所有值
13         for(Size value:Size.values()){
14             System.out.println(value);
15         }
16     }
17 }
18  enum Size{SMALL,MEDIUM,LARGE};

枚举类型对象之间比较可以直接用==;

枚举可以使用value方法来遍历枚举;

value of 可以返回带指定名称的指定枚举类型的枚举常量;

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

double类型

1 public class TestDouble {
2 
3     public static void main(String args[]) {
4         System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
5         System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
6         System.out.println("4.015 * 100 = " + (4.015 * 100));
7         System.out.println("123.3 / 100 = " + (123.3 / 100));
8     }
9 }

 double类型的数值计算结果不精确

原因:

这个问题涉及到二进制与十进制的转换

我们知道计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。

而N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4 = 1×102+2×101+3×100+4×10(-1);其它进制的也是同理,例如二进制数11.01 = 1×21+1×20+0+1×2(-2) = 十进制的3.25。

Double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。

如果这里不好理解,那我们再举个例子:如要用4bit来表示一个十进制小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,计算机内应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。显然这个区间里面除了我们需要的3.26,还有很多其他的数字。

再回到Double的64bit上来,同理:我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位的,比如1/3),而Double类型的数值只有64bit,后面舍去的位数就一定会带来误差,无法得到“数学上精确”的结果。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

 出现这种结果的原因为:

用运算符 + 连接字面量“X+Y” 和计算结果 +X 将String 和其它数据类型相加,结果是一个新的String

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

反码 原码 补码

1. 原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1] = 0000 0001

[-1] = 1000 0001

2. 反码

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001] = [00000001]

[-1] = [10000001] = [11111110]

3. 补码

补码的表示方法是:

正数的补码就是其0

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001] = [00000001] = [00000001]

[-1] = [10000001] = [11111110] = [11111111]

原文地址:https://www.cnblogs.com/Nojava/p/13752168.html