数据类型:
boolean,byte,char
short,int,long,float,double
String,Enum,Array(Object派生下来)
关于32位int的范围是多少?
-2^31 ~ 2^31-1
直观的表示方法(错误的)
这样看起来没问题,但最后会多出一个0
+0和-0,两个数相等,二进制却有两个,破坏了二进制运算中的规律,处理起来会很麻烦
用补码的方法表示:
补码:取反加1
例如:-1
正数1的二进制位0000…1——取反——1111…0——+1——1111…1
所以1111…1表示的就是-1
用补码表示的好处:
下面是用补码表示一些特殊的数
1000…0 -2^31(32位表示的最大的负数)
1111…1 -1
0000…0 0
0111…1 2^31-1(32位表示的最大的正数)
可以看出0的表示只有一个0000…0,而用二进制1000…0不像直观方法中那样表示0,而是表示-2^31。
从而可以用到补码的好处
在数学上(-1)+(+1)=0
用补码运算1111…1+0000…1=0000…0(得到的结果和我们数学运算结果是一致的)
而用直观方法对应的-1为1000…1+0000…1=1000…10(不等于0)
因此32位int表示范围为:
-2^31 ~ 2^31-1(共2^32个数)
浮点数与定点数
符号位|指数部分|基数部分
64位double范围:+/-10^308
64位double精度:10^15
因为浮点数的精度问题,浮点数的比较要注意的问题
用a==b比较的话,很可能因为精度达不到而判断出错
可以通过Math.abs(a-b)<eps来处理这个问题,也不能万无一失,只是可以根据需求设置eps为10的负几次方
使用java提供的BigDecimal算钱。