数据类型拓展01

1、整数拓展

1.1、进制

        进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制---X进制,就表示每一位上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

1.2、二进制

        二进制有两个特点:由两个数码0、1组成,二进制数运算规律是逢二进一。

        为区别于其它进制,二进制数的书写通常在数的右下方注上基数2,或在后面加B表示,其中B是英文二进制Binary的首字母。

        例如:二进制数10110011可以写成(10110011)2,或写成10110011B。对于十进制数可以不加标注,或加后缀D,其中D是英文十进制Decimal的首字母D。计算机领域我们之所以采用二进制进行计数,是因为二进制具有以下优点:

        1.二进制数中只有两个数码0和1,可用具有两个不同稳定状态的元器件来表示一位数码。例如,电路中某一通路的电流的有无,某一节点电压的高低,晶体管的导通和截止等。

        2.二进制数运算简单,大大简化了计算中运算部件的结构。

        二进制数的加法和乘法基本运算法则各有四条,如下:

        0+0=0,0+1=1,1+0=1,1+1=10

        0×0=0,0×1=0,1×0=0,1×1=1

        3.二进制天然兼容逻辑运算。

        但是,二进制计数在日常使用上有个不便之处,就是位数往往很长,读写不便,如:把十进制的100000D写成二进制就是11000011010100000B,所以计算机领域我们实际采用的是十六进制。二进制数转换为十六进制数时,长度缩减为原先的约四分之一,把十进制的100000写成八进制就是303240。十六进制的一个数位可代表二进制的四个数位。这样,十进制的100000写成十六进制就是186A0。

2.3、十进制

        由于人类解刨学的特点,双手共有十根手指,故在人类自发采用的进位制中,十进制是使用最为普遍的一种。成语“屈指可数”某种意义上来说描述了一个简单计数的场景,而原始人类在需要计数的时候,首先想到的就是利用天然的算筹—手指来进行计数。

        数值本身是一个数学上的抽象概念。经过长期的演化、融合、选择、淘汰,系统简便、功能全面的十进制计数法成为人类文化中主流的计数方法,经过基础教育的训练,大多数的人从小就掌握了十进制计数方法。盘中放了十个苹果,通过数苹果我们抽象出来“十”这一数值,它在我们的脑海中就以“10”这一十进制编码的形式存放和显示,而不是其它的形式。从这一角度来说,十进制编码几乎就是数值本身。

        十进制的基数为10,数码由0-9组成,计数规律逢十进一。

2.4、八进制

        由于二进制数据的基数R较小,所以二进制数据的书写和阅读不方便,为此,在小型机中引入了八进制。八进制的基数R=8=2^3,有数码0、1、2、3、4、5、6、7,并且每个数码正好对应三位二进制数,所以八进制能很好地反映二进制。八进制用下标8或数据后面加O表示 例如:二进制数据 (11 101 010 . 010 110 100)2 对应八进制数据 (352.264)8或352.264O。

2.5、十六进制

        由于二进制数在使用中位数太长,不容易记忆,所以又提出了十六进制数。

        十六进制数有两个基本特点:它由十六个数码:数字0~9加上字母A-F组成(它们分别表示十进制数10~15),十六进制数运算规律是逢十六进一,即基数R=16=2^4,通常在表示时用尾部标志H或下标16以示区别,在c语言中用添加前缀0x以表示十六进制数。

例如:十六进制数4AC8可写成(4AC8)16,或写成4AC8H。

2、浮点数拓展

        float与double

float f = 0.1f;
double d = 1.0/10;

System.out.println("f:"+f);
System.out.println("d:"+d);
System.out.println(f==d);

运行结果

f:0.1
d:0.1
false

原因:浮点数是有限的、离散的,会存在舍入的误差,是接近但不等于的。

所以最好不要用浮点数进行比较。

3、BigDecimal

        Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。     

3.1、4个构造方法

  1. BigDecimal(int) 创建一个具有参数所指定整数值的对象。
  2. BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)
  3. BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
  4. BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象 。

为什么不建议采用第二种构造方法?如下代码:

        BigDecimal bigDecimal1 = new BigDecimal(2.3);
        BigDecimal bigDecimal2 = new BigDecimal("2.3");

        System.out.println(bigDecimal1);
        System.out.println(bigDecimal2);

运行结果

bigDecimal1:2.29999999999999982236431605997495353221893310546875
bigDecimal2:2.3

3.2、8种格式化

  • ROUND_UP :向远离0的方向舍入
  • ROUND_DOWN :向零方向舍入
  • ROUND_CEILING :向正无穷方向舍入
  • ROUND_FLOOR :向负无穷方向舍入
  • ROUND_HALF_UP :向(距离)最近的一边舍入,如果两边(的距离)是相等时,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入
  • ROUND_HALF_DOWN :向(距离)最近的一边舍入,如果两边(的距离)是相等时,向下舍入, 例如1.55 保留一位小数结果为1.5
  • ROUND_HALF_EVEN :向(距离)最近的一边舍入,如果两边(的距离)是相等时,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
  • ROUND_UNNECESSARY :计算结果是精确的,不需要舍入模式
        BigDecimal intStr = BigDecimal.valueOf(10);
        BigDecimal doubleStr = new BigDecimal(Double.toString(3));
        System.out.println("intStr:"+intStr);
        System.out.println("doubleStr:"+doubleStr);
        //后面代表的是舍入模式的值
        //divide(除法)
        System.out.println("ROUND_UP:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_UP));
        System.out.println("ROUND_DOWN:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_DOWN));
        System.out.println("ROUND_CEILING:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_CEILING));
        System.out.println("ROUND_FLOOR:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_FLOOR));
        System.out.println("ROUND_HALF_UP:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_HALF_UP));
        System.out.println("ROUND_HALF_DOWN:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_HALF_DOWN));
        System.out.println("ROUND_HALF_EVEN:" + intStr.divide(doubleStr,2,BigDecimal.ROUND_HALF_EVEN));

执行结果:

intStr:10
doubleStr:3.0
ROUND_UP:3.34
ROUND_DOWN:3.33
ROUND_CEILING:3.34
ROUND_FLOOR:3.33
ROUND_HALF_UP:3.33
ROUND_HALF_DOWN:3.33
ROUND_HALF_EVEN:3.33

3.3、常用方法

  • add(BigDecimal): BigDecimal对象中的值相加,返回BigDecimal对象
  • subtract(BigDecimal): BigDecimal对象中的值相减,返回BigDecimal对象
  • multiply(BigDecimal): BigDecimal对象中的值相乘,返回BigDecimal对象
  • divide(BigDecimal): BigDecimal对象中的值相除,返回BigDecimal对象
  • toString(): 将BigDecimal对象中的值转换成字符串
  • doubleValue(): 将BigDecimal对象中的值转换成双精度数
  • floatValue(): 将BigDecimal对象中的值转换成单精度数
  • longValue(): 将BigDecimal对象中的值转换成长整数
  • intValue(): 将BigDecimal对象中的值转换成整数
  • a.max (b) 比较取最大值
  • a.min(b) 比较取最小值
  • a.abs() 取最绝对值
  • negate(): 取相反数
  • (BigDecimal).compareTo(BigDecimal2) : 比较两个BigDecimal 对象的大小; 返回值为-1,表示bigdemical小于bigdemical2; 返回值为 0,表示bigdemical等于bigdemical2; a = 1,表示bigdemical大于bigdemical2;

你可能感兴趣的:(Java基础,算法,java)