微信公众号所关注 gywalke学习 定时更新
Java程序基础(2): 1. 变量与常量 2.常用数据类型
1.变量与常量
⑴变量名命名规则
①变量必须要以字母,"_“或”$"开头
②变量可以包含数字,不能以数字开头
③除了”_”和“$”,变量名不能包含其它特殊字符
④不能使用Java关键字
⑤注意:Java区分大小写
⑵常量:final 数据类型 变量名=值
常量表示的是在程序中不能被修改的数据;声明常量必须用final关键字
2.常用数据类型
整型
byte字节型1字节 8bit 最大存储数据量是255,存放的数据范围是-128~127之间
short短整型2字节 16bit最大数据存储量是65536,数据范围是-32768~32767之间
int整型4字节 32bit最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1 (21亿)
long长整型8字节 64bit最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1
浮点型
float单精度4字节 32bit数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F
double双精度8字节 64bit数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加
字符类型
char字符型用单引号
布尔类型
boolean布尔型true/false(只有真假两种结果)
数据值域的知识说明:
1.一个bit是计算机考研存储的最小的数据单位。即1位,只可能是0或1.
2.一个byte由八个bit组成,即八位,可以表示256个整数值,又由于byte在Java中有符号之分(即正负数),所以范围位-128~127.
3.一个char在Java中由两个byte组成,用来表示一个字符,即unicode编码,是无符号类型。
4.int和float在Java中由4个byte组成。
5. 每个long或double型变量占用八个byte的存储空间。
6. 1T=1024G,1G=1024M,1M=1024K,1K=1024B
特别地:
int和 float(long和double都是8个字节) 都是四个字节(都是8个字节)为什么他们的表述的范围一样?
int的取值范围是:-2^31 ~ 2^31 - 1,这里32位中第一位是符号位,剩下的31位是表示数值的。
而float的组成是:1位符号位+8位指数(q)+23位底数(b),其解释出来的形式是:b^q,由于指数q是8位有符号整数,范围是-128 ~ 127,23位的底数(无符号)最大值就是2 ^ 23,算上指数的话,最大可以表达到2 ^ 23 ^ 127,但是由于计算机的运算能力限制,并不能处理到如此大的数,但是其取值范围也会比32位整数大很多。
由于float类型是一个幂计算式,所以很多时候并不能表达一个精确值,例如0.1,如果使用float在内存中会被表示为0.10000000000000001,如果进行反复计算将会导致非常大的误差。
float和double的表示的方法:
1.符号位:最高位31,表示浮点数的正负,0为正,1为负;
2.指数位:占的位数代表着改类型的范围,例如float指数位范围第30-23位(占8bit),则范围为2^8-1等同于-128~128
计算方式同float,double的指数范围:第62-52位(占11bit),范围:2^11-1等同于-1024~1024
3.尾数位:占的位数代表着精度,也就是小数点后面的尾数。 float的尾数:23位,其范围为:0~2^23,而2^23=8388608=106.92,
所以float的精度为6~7位,能保证6位为绝对精确,7位一般也是正确的,8位就不一定了(但不是说8位就绝对不对了)
计算方式同float,double的尾数:52位,2^52=2.220446049250313E-16,最小是16位,但最小不是1.0E-16,所以精度是15~16,能保证15,一般16位。
float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场啦。
BigInteger 和BigDecimal的区别 和BigDecimal的详解
一般来说,BigInteger用的不是很多,BigDecimal用的稍微多一点,就比如说JDBC中,如果一个字段的数据库类型是Number, 那么getObject().getClass()的结果是java.math.BigDecimal。
BigInteger相比Integer的确可以用big来形容。它是用于科学计算,Integer只能容纳一个int, 所以最大值也就是2的31次访减去1,十进制为2147483647,如果需要计算更大的数,那么31位显然是不够用了,BigInteger能够容纳的位数那可就大了,我简单试了一下,上千位没有任何问题。除了容量大之外,BigInteger还封装了一些常见的操作,比如+-*/的基本操作,还有绝对值,相反数,最大公约数,是否是质数等等的运算。
BigDecimal的实现利用到了BigInteger, 所不同的是BigDecimal加入了小数位的概念,比如BigDecimal d = new BigDecimal(new BigInteger(ib),5);5表示的是5个小数位。BigDecimal可以用来做超大的浮点数的运算,比如+-*/的运算,其中除法运算是最复杂的,因为商的位数还有除不断的情况下末位小数点的处理都是需要考虑的。
new BigDecimal(-7.5).divide(new BigDecimal(1),0,BigDecimal.ROUND_UP);
上面的这个运算中divide的第二个参数表示商的小数点位数,最后一个参数指的是近似处理的模式。一共有一下几个模式:
BigDecimal.ROUND_UP 最后一位如果大于0,则向前进一位,正负数都如此。
BigDecimal.ROUND_DOWN 最后一位不管是什么都会被舍弃。
BigDecimal.ROUND_CEILING 如果是正数,按ROUND_UP处理,如果是负数,按照ROUND_DOWN处理。例如7.1->8; -7.1->-7;所以这种近似的结果都会>=实际值。
BigDecimal.ROUND_FLOOR 跟BigDecimal_ROUND_CEILING相反。例如7.1->7;-7.1->-8。这种处理的结果<=实际值。
BigDecimal.ROUND_HALF_DOWN 如果最后一位<=5则舍弃,如果>5, 向前进一位。如7.5->7;7.6->8;-7.5->-7
BigDecimal.ROUND_HALF_UP 如果最后一位<5则舍弃,如果>=5, 向前进一位。反之舍弃。如7.5->8;7.4->7;-7.5->-8
BigDecimal.ROUND_HALF_EVEN 如果倒数第二位是奇数,按照BigDecimal.ROUND_HALF_UP处理,如果是偶数,按照BigDecimal.ROUND_HALF_DOWN来处理。如7.5->8;8.5->8;7.4->7;-7.5->-8
总结:
float与double的范围和精度
1、范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:1bit(符号位) 8bits(指数位) 23bits(尾数位)
double:1bit(符号位) 11bits(指数位) 52bits(尾数位)
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
2、精度
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
当超过这些精度的时候可以使用 BigDecimal来设置我们需要的精度(一班银行等对精度有很大的要求的时候是使用BigDecimal)
网友评论