java byte类型如何存取大于127的整数
当我们给b赋值成130后,会出现错误信息,这是因为byte的取值范围时-128到127
我们知道130的二进制位10000010,我们把它当成有符号的数值看的话,应该是个负数,而计算机中是以补码的形式存储的数字,因此要在此数值的基础上“符号位不变,其他位取反加一”,然后就是我们所需要的值,取反:11111101,加一:111111110,该数值为-126;
最后说一下大于127的整数被存储的简单规则就是用这个数值减去256,比如130-256=-126
byte b = -126
想使用java的byte存储 0-255的数据 就要使用新的方法
比如 底层通信传递过来一个数据 byte=130 传递到java这里 变成了130-256=-126 想让这个数做运算我们就要把这个数 &0xFF 变成我们需要的数据130
一:基础类型
正确使用equals方法
"SnailClimb".equals(str);// false
Objects.equals(null,"SnailClimb");// false (JDK7 引入的工具类)
整形包装类值的比较
所有整型包装类对象值的比较必须使用equals方法
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);//false
Integer i1=40
这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40)
。因此,i1
直接使用的是常量池中的对象。而Integer i1 = new Integer(40)
会直接创建新的对象。因此,输出 false 。
说明:对于Integer var=? 在-128到127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内Integer值可以直接使用==进行判断,但是这个区间之外的说有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
浮点数精确到问题
具有基本数学知识的我们很清楚的知道输出并不是我们想要的结果(精度丢失),我们如何解决这个问题呢?一种很常用的方法是:使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
System.out.println(x); /* 0.1 */
System.out.println(y); /* 0.1 */
System.out.println(Objects.equals(x, y)); /* true */
通过 setScale
方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA会提示。
byte的运算问题
结论:byte不能直接进行加减运算 因为他存的是负数 想运算要转成&0xFF 变成对应的整数在运算