zoukankan      html  css  js  c++  java
  • java 基本类型详解 及 常见问题

    鄙人不才,基础不好,趁着闲时简单学习一下,仅作学习分享,如有不正确地方还请各位看客不吝指出。

     

    常用的基本类型有:byte(8)、short(16)、char(16,取值从0-65535[2^16-1])、int(32)、long(64)、float(32)、double(64)、boolean(true/false).

         注:关于boolean的长度的问题csdn的论坛中有讨论:http://bbs.csdn.net/topics/190122943 ,有兴趣可以去看一下.
                这个问题和String s = "a"产生几个对象类型,很多时候和JVM相关。(我看的时候本来感觉懂了,看着看着就晕了)

    具体做一下简单分类:
         字符型:char
         布尔型:boolean
         数值型(细分为两类)
              整值型:byte、short、int、long
              浮点型:float、double

    每个类型的长度不做详述了,可以通过(2^+-n)-1进行计算,char特别一点已指出。

     

    对基本类型的基本操作符不做详解,但以下问题可以稍作了解:

    移位操作(<<,>>,>>>)
         移位操作符操作可对byte、short、char、int、long。
         计算过程中byte,short,char会自动转换为int类型进行计算。因此不能把计算将结果直接赋值回原有类型。
         当然可以进行强转,但不推荐。
              例如:char c = (char)('a'<<17);-->char c = (char)(12713984);-->最终得到的c值为0对于的字符。
         int类型操作结果为int类型。long操作结果为long。
         移位操作有周期性,int周期为32(1<<32 = 1),long周期为64(1L<<64 = 1L)


    溢出问题
         计算过程中计算数值可能会存在超出类型最大/小值的情况。此时不会报错,但是计算结果就是错了。
         此类问题可以采用更高精度类型或BigInteger、BigDecimal进行解决。
         例如:
              int i = Integer.MAX_VALUE;//2147483647
              int x = i + i;
         此时,x的值却不是4294967294 而是 -2.

        

        还有一种情况,强制转换也会导致精度损失

        例如:

                int a = 1234567890;

                float f = a;

        int 可以向同为32位的float转换,但由于float不可能精确到9个有效位,因此精度会有损失.


    关于小数位精度问题
         经常会遇到 double d = 2.0-1.1;的问题,这里讲一下为什么得到的结果不是0.9?

         众所周知,计算机采用二进制进行数据存储。2.0 即2表示为二进制为 10

         1.1用二进制表示分为两个部分1和0.1

         1 = 1

          0.1的采用乘2取整法计算

          0.1*2=0.2  ... 0

          0.2*2=0.4  ... 0

          0.4*2=0.8  ... 0

          0.8*2=1.6  ... 1  ... 0.6

          0.6*2=1.2  ... 1  ... 0.2

          0.2*2=0.4  ... 0

          0.4*2=0.8  ... 0

          0.8*2=1.6  ... 1  ... 0.6

          0.6*2=1.2  ... 1  ... 0.2

          0.2*2=0.4  ... 0

          0.4*2=0.8  ... 0

          0.8*2=1.6  ... 1  ... 0.6

          0.6*2=1.2  ... 1  ... 0.2

          .....循环了

          1.1 = 1.00011001100110011001100110011.....

          但是double的长度有限制,因此部分精度会被截断。因此不能精确进行计算。

         

          结论:需要精确计算的时候使用BigDecimal吧.
      
         java中,float类型的变量只有7位的精度,而double类型的变量有15位的精度。 
         如果超出范围就会造成精度丢失,原因是十进制数的二进制表示可能不够精确,因为计算机会先把这个数字转换成2进制,
         就是0101那种,超出的部分会被截取,导致出现这种数据。
      
    关于舍入问题
         这个问题一般与需求有关。
         new BigDecimal(0.1234567890).setScale(4,取舍方式).doubleValue();
         取舍方式提供:

             BigDecimal.ROUND_HALF_UP 四舍五入
              BigDecimal.ROUND_HALF_DOWN 五舍六入
              BigDecimal.ROUND_HALF_EVEN 四舍六入五取偶

     

    额,基本就这样了,如有不足请补充.

    
  • 相关阅读:
    mysql explain用法和结果的含义
    heapset水平自动扩容
    dashboard安装
    对List集合中的对象进行按某个属性排序
    MySql查询当天、本周、本月、本季度、本年的数据
    三种List集合的遍历方式
    Date相关处理
    ubuntu-14.04.2-desktop使用方法
    PowerShell命令卸载Win10内置应用
    Windows下MySQL绿色版安装配置与使用
  • 原文地址:https://www.cnblogs.com/ssp2110/p/3797684.html
Copyright © 2011-2022 走看看