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

常用的基本类型有: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 四舍六入五取偶

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



java 基本类型详解 及 常见问题的更多相关文章

  1. JAVA集合类型详解

    一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...

  2. java枚举类型详解

      枚举类型是JDK1.5的新特性.显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类.而这些类都是类库中Enum类的子类(java.lang.Enum<E>).它 ...

  3. Java字符串类型详解

    Java 字符串类主要有String.StringBuffer.StringBuilder.StringTokenizer 1.字符串类型底层都是使用char数组进行实现. 2.从jdk1.7以后,S ...

  4. Java虚拟机详解----JVM常见问题总结

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  6. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  7. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  8. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  9. Java类加载器详解

    title: Java类加载器详解date: 2015-10-20 18:16:52tags: JVM--- ## JVM三种类型的类加载器- 我们首先看一下JVM预定义的三种类型类加载器,当一个 J ...

随机推荐

  1. [JavaWeb基础] 017.Struts2 和 ajax交互简介

    在网页开发中,我们为了只对网页的某块内容进行实时更新,而不对其他不需要更新的内容进行刷新,从而提高响应速度和节省流量,我们采用了页面的异步刷新技术Ajax,那么我们的Struts2框架在这一方面是如何 ...

  2. 10 . Python之面向对象

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向对象初识别 面向过程v ...

  3. Codeforces Round #646 (Div. 2)【B. Subsequence Hate题解】

    具体思路已经在代码注释中给出,这里不再赘述. #include<iostream> #include<algorithm> using namespace std; int t ...

  4. 【Hadoop】配置全分布式模式

    分布式原理 配置 详细过程 假设有三台虚拟机,1台master主机namenode,2台slave奴隶机datanode 所有机器都要配好jdk.Java环境变量.hadoop_env.sh里java ...

  5. JavaScript (六) js的基本语法 - - - Math 及 Date对象、String对象、Array对象

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Math 1.Math对象的案例 var result= Math.max(10,20,30,40) ...

  6. 第八届蓝桥杯JavaC组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.数位和 题目描述 数学家高斯很小的时候就天分过人.一次老师指定的算数题目是:1+2+-+100. 高斯立即做出答案:5050! 这次你 ...

  7. java实现识别复制串

    ** 识别复制串** 代码的目标:判断一个串是否为某个基本串的简单复制构成的. 例如: abcabcabc,它由"abc"复制3次构成,则程序输出:abc aa 由"a& ...

  8. Java实现第九届蓝桥杯第几天

    第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. import java.util.Cal ...

  9. Python基础语法之“print()”函数

    print()函数是Python入门的第一个必学知识点,它经常被用来调试已写的代码,检验效果,今天小老鼠就带你盘点一下print()函数在Python中如何使用. print()函数的工作流程是这样的 ...

  10. cocos2dx获得字体的宽高

    Android: 1.在CCImage中添加下面的方法: //头文件声明略. cocos2d::CCSize CCImage::getStringSize(const char *text, cons ...