9.15
一、运行EnumTest
运行结果
1、s == t比较了s和t引用的对象是否相同,由于SMALL和LARGE是不同的枚举值,所以结果为false。
2、s.getClass().isPrimitive()检查Size类是否为原始数据类型,但实际上枚举类型不是原始数据类型,所以结果为false。
3、Size.valueOf("SMALL")将字符串"SMALL"转换为Size类型的枚举值,然后和s比较,由于两者引用同一个枚举对象,所以结果为true。
4、Size.values()返回Size枚举类型的所有值,通过循环遍历并打印每个值。
总结:枚举类型允许定义一组有限的命名常量,并可以进行比较、转换和遍历操作。在示例代码中,通过演示了枚举类型的比较、转换和遍历操作。
二、
1.原码
原码是指一个某进制的数转化为二进制后的用01表示的数字,数的绝对值与符号一起编码,称为原码。
如10进制的9转化为二进制为1001,因原码是连带符号一起表示,所以最前边留下一位来表示数的正负,0代表正,1代表负,所以9用二进制表示即为01001。那么十进制的-70用二进制如何表示,我们这里先讲述一下各进制数如何转化。
①我们可以先将各进制数转化为十进制数。
如一个n进制的数76.35,将其转化为十进制只需每位数乘以其所对应的权,所以n进制的76.35转化公式为7*n^1+6*n^0+3*n^(-1)+5*n^(n-2)。
②现在由十进制转化为n进制,用616转化为二进制为例。
616/2=308······0
308/2=154······0
154/2=77······0
77/2=38······1
38/2=19······1
19/2=9······1
9/2=4······1
4/2=2······0
2/2=1······0
1/2=0······1
所以616转化为二进制就是01001111000,那么-616的二进制数就是11001111000。
2.反码
顾名思义就是与原来的码原码反过来就是反码,但是要注意符号位是不变化的,如01001111000的反码就是00110000111,11001111000的反码就是10110000111。
3.补码
补码的计算方式很简单就是反码加一,在末尾加个一就变成了补码。
public class BinaryOperations { public static void main(String[] args) { int positiveNum = 10; int negativeNum = -10; // 按位取反(~) System.out.println(~positiveNum); System.out.println(Integer.toBinaryString(~positiveNum)); // 按位与(&) int resultAnd = positiveNum & negativeNum; System.out.println(resultAnd); System.out.println(Integer.toBinaryString(resultAnd)); // 按位或(|) int resultOr = positiveNum | negativeNum; System.out.println(resultOr); System.out.println(Integer.toBinaryString(resultOr)); // 按位异或(^) int resultXor = positiveNum ^ negativeNum; System.out.println(resultXor); System.out.println(Integer.toBinaryString(resultXor)); } }
-11 11111111111111111111111111110101 2 10 -2 11111111111111111111111111111110 -4 11111111111111111111111111111100
我们可以确定Java中整数类型采用补码表示。按位取反操作(~)得到的结果与补码取反是一致的。按位与、按位或和按位异或等位操作结果也与补码的运算规则相符。
三、Addtion
四、Test
public class Test { private static int value=1; public static void main(String[] args) { int value=2; System.out.println(value); } }
输出结果为2
五、TestDouble
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
六、TestBigDecimal
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 是一种二进制浮点数表示方法,它使用有限位表示无理数的近似值。在转换和计算过程中,可能会导致舍入误差和精度丢失。这是因为某些十进制小数无法精确地表示为有限位的二进制小数。 当你将 double 数值直接传递给 BigDecimal 构造函数时,会发生一个重要的步骤,即将 double 数值转换成其二进制表示形式的字符串。该转换可能导致舍入误差,从而影响最终的精确计算。 举个例子,考虑 double 数值 0.1,它无法精确表示为有限位的二进制小数。当你直接将 0.1 作为 double 数值传递给 BigDecimal 的构造函数时,实际上会使用该近似值的二进制表示形式来构建 BigDecimal 对象。这可能导致意外的计算结果,因为你期望的是精确的十进制小数值。 所以,为了避免这些问题,使用字符串作为 BigDecimal 构造函数的参数更可靠。使用字符串表示法可以确保你提供的数值以精确的十进制形式传递给 BigDecimal,而不会发生转换引起的精度问题。
七、
public class Main { 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
八、RandomStr
public class RandomStr { public static void main(String[] args) { //定义一个空字符串 String result = ""; //进行6次循环 for(int i = 0 ; i < 6 ; i ++) { //生成一个97~122的int型的整数 int intVal = (int)(Math.random() * 26 + 97); //将intValue强制转换为char后连接到result后面 result = result + (char)intVal; } //输出随机字符串 System.out.println(result); } }