之前的文章提到,Java语言不但支持大众熟知的十进制数,也支持计算机特有的二进制数、八进制数和十六进制数。可是在给数值变量赋值的时候,等号右边的数字明显属于十进制,那究竟要如何书写其它进制的数字呢?为此Java规定了几种数字前缀,以这些前缀开头的数字就表示特定进制的数值,二进制、八进制和十六进制及其对应的前缀说明如下:
1、二进制,该进制的数值以0b或者0B开头,其后的数字只能是0和1。注意b是binary(二进制)的首字母。
2、八进制,该进制的数值以0开头,其后的数字只能是0到7。
3、十六进制,该进制的数值以0x或者0X开头,其后的数字除了0到9之外,还包括字母a到f(不区分大小写)。注意x代表hexadecimal(十六进制)。
下面是声明各种进制变量的代码例子,依次演示了二进制数、八进制数、十六进制数和十进制数的赋值操作:

public class Prefix {

	public static void main(String[] args) {
int binary = 0b11; // 二进制数,0b也可以写成0B
System.out.println("binary="+binary);
int octonary = 011; // 以0开头,后面非bB非xX的就是八进制数
System.out.println("octonary="+octonary);
int hexadecimal = 0x11; // 十六进制数,0x也可以写成0X
System.out.println("hexadecimal="+hexadecimal);
int hexLetter = 0xff; // 十六进制数不区分大小写,如ff也可以写成FF
System.out.println("hexadecimal="+hexLetter);
int decimal = 11; // 没有任何前缀,则默认为十进制数
System.out.println("decimal="+decimal);
}
}

运行上述代码,在Console窗口的观察结果如下图所示。可见二进制的0b11转成十进制数为3,八进制的011转成十进数为8,十六进制的0x11转成十进数为17,十六进制的0xff转成十进数为255。

由于int类型最大只能表示21亿4千多万的整数,因此再大的整数就要使用long长整型变量了。例如截止2018年元旦,世界总人口达到74亿4444万3881,使用long变量保存世界人口的话,赋值代码本应如下所示:

		long worldPopulation = 7444443881; // 这样写会报错,因为整数默认是int类型

谁料Eclipse居然报错,提示“The literal 7444443881 of type int is out of ”,意思是该数字超出了int类型的表示范围。原来Java里面的整数默认是整型,只分配四个字节的临时空间,然而7444443881超出了整型数的范围,致使默认的存储空间不够用了。要想扩大临时的存储空间,得在数字后面补上l或者L,表示该整数要求分配八个字节的长整型临时空间,这样才供得起7444443881这个大神。于是修改后的长整型赋值代码如下所示:

		// 截至2018年元旦,世界人口大约有74亿
long worldPopulation = 7444443881L; // 长整型数要在数值末尾加上l或者L
System.out.println("worldPopulation="+worldPopulation);

注意上面代码末尾的L只表示数据类型,变量值并不包括“L”这个字母,运行测试代码可见日志打印结果为“worldPopulation=7444443881”。
刚提到Java的整数默认是整型,相对应的,Java的小数默认是双精度型,那么试试下面的代码能否将小数赋值给float变量?

		float huilv = 3.14; // 这样写会报错,因为小数默认是double类型

果然Eclipse也提示出错了,正确的写法要在小数末尾补上f或者F,表示该小数按照浮点数型分配存储空间。改写后的浮点数赋值代码如下所示:

		// 3.14是中国古代数学家刘徽求得的圆周率数值,又称徽率
float huilv = 3.14F; // 浮点数要在数值末尾加上f或者F
System.out.println("huilv="+huilv);

其实小数后面也可以补上d或者D,表示该小数按照双精度型分配存储空间,只是因为Java的小数默认就是double类型,所以小数后面的D可加可不加,不影响正常的编译。

这下几种数字类型都能够正确地赋值了,但是还有个细节问题,当数字的位数很多的时候,后面有多少个零会让初学者看得眼花缭乱。现实生活中,整数通常每隔四位就在中间补上空格或者补上逗号,譬如说中国的领土面积是960万平方公里,实际书写一般为“960 0000”或者“960,0000”,这样可以很清楚地区分万的单位乃至亿的单位。在Java编程中,从Java7开始,允许在数字中间插入下划线作为分隔符,下划线本身没有保存到变量中,它的作用类似前面的空格和逗号,仅仅是方便程序员数清具体的位数罢了。下面是在数字变量赋值时添加下划线的代码例子:

		// 中国的领土面积是960万平方千米
int chinaArea = 960_0000; // 从Java7开始,数字中间允许添加下划线,从而可以更方便地区分位数
System.out.println("chinaArea="+chinaArea);

虽然下划线方便了程序员数数,数字的长度却变得更长了,倘若再来一个更大的整数,例如太阳到地球的距离为1.5亿公里,展开可是150000000千米,Java赋值加了下划线则为“1_5000_0000”,此时后面拖了许多个零。在数学上,可以通过科学记数法表示这种较大的数,也就是把一个数书写成a与10的n次幂相乘的形式。Java代码也有与科学记数法类似的表达方式,像1.5亿这个数字,其实等于1.5乘以10的8次方,在代码中可以通过“E8”或者“e8”表示10的8次方,于是采取科学记数法的Java赋值代码举例如下:

		// 太阳距离地球1.5亿千米
double sunDistance = 1.5E8; // E8表示乘以10的8次方,E是exponent(指数)的首字母
System.out.println("sunDistance="+sunDistance);

注意上述代码中的1.5是小数,所以必须使用双精度数作为赋值变量,而不能用整形或长整型数。即使E前面的数字是整数,该变量也只能是双精度类型,因为Java约定了科学记数法专用于双精度数字。

Java开发笔记(六)特殊数字的表达的更多相关文章

  1. Java开发笔记(三十一)字符类型的表达

    前面介绍的Java编程,要么是与数字有关的计算,要么是与逻辑有关的推理,充其量只能实现计算器和状态机.若想让Java运用于更广阔的业务领域,就得使其支撑更加血肉丰满的业务场景,而丰满的前提是能够表达大 ...

  2. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  3. Java开发笔记(二十六)方法的输出参数

    前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ...

  4. Java开发笔记(六十四)静态方法引用和实例方法引用

    前面介绍了方法引用的概念及其业务场景,虽然在所列举的案例之中方法引用确实好用,但是显而易见这些案例的适用场合非常狭窄,因为被引用的方法必须属于外层匿名方法(即Lambda表达式)的数据类型,像isEm ...

  5. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

  6. Java开发笔记(六十六)映射:HashMap和TreeMap

    前面介绍了两种集合的用法,它们的共性为每个元素都是唯一的,区别在于一个无序一个有序.虽说往集合里面保存数据还算容易,但要从集合中取出数据就没那么方便了,因为集合居然不提供get方法,没有get方法怎么 ...

  7. Java开发笔记(六十八)从泛型方法探究泛型的起源

    前面介绍各种容器之时,通过在容器名称后面添加包裹数据类型的一对尖括号,表示该容器存放的是哪种类型的元素.这样一来总算把Java当中的各类括号都凑齐了,例如包裹一段代码的花括号.指定数组元素下标的方括号 ...

  8. Java开发笔记(七十六)如何预防异常的产生

    每个程序员都希望自己的程序稳定运行,不要隔三岔五出什么差错,可是程序运行时冒出来的各种异常着实烦人,令人不胜其扰.虽然可以在代码中补上try/catch语句捕捉异常,但毕竟属于事后的补救措施.与其后知 ...

  9. Java开发笔记(九十六)线程的基本用法

    每启动一个程序,操作系统的内存中通常会驻留该程序的一个进程,进程包含了程序的完整代码逻辑.一旦程序退出,进程也就随之结束:反之,一旦强行结束进程,程序也会跟着退出.普通的程序代码是从上往下执行的,遇到 ...

  10. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...

随机推荐

  1. java课程之团队开发冲刺阶段1.4

    一.总结昨天进度 1.昨天任务全部完成 二.遇到的问题 1.对数据库的使用陌生 2.使用sqlite有些困难 3.对如何解决查询课程问题暂时没有找到好的解决方案 三.今日任务 1.由于周一的课程比较紧 ...

  2. C++实验一

    实验结论 2-28 if...else #include <iostream> #include <stdlib.h> using namespace std; int mai ...

  3. cadence焊盘及元件封装制作

    前面学习了元件封装的制作,由于琐碎事情的耽误,加上学习python,没有及时的总结这部分内容,现在做一个补充!

  4. Python学习笔记【Supervisor】:使用Supervisor监控Tornado进程

    Linux常见应用服务配置模式nginx和supervisor:采用主配置文件+项目配置文件 安装(如果使用pip安装注意看是否需要指定使用python2版本) 第一步:在Linux中使用apt-ge ...

  5. [Swift]LeetCode229. 求众数 II | Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Note: The a ...

  6. 我们身边那些优秀的.NET开发者-

    我们身边那些优秀的.NET开发者----邹琼俊 初识大佬 非常有幸通过博客园认识了邹琼俊邹老师,他也是<ASP.NET企业级开发实战>这本书的作者,这本书的销量达到了将近九千本,在这个实体 ...

  7. 10 个深恶痛绝的 Java 异常。。

    异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 什么是异常及异常的分类请看这篇文章:一张图搞清楚 Java ...

  8. 记一次令人窒息的线上fullgc调优

    今天第二篇采坑了... ... 现场因为处理太急促没有保留,而且是一旁协助,没有收集到所有信息实在是有些遗憾...只能靠记忆回想一些细节 情况是一台服务器一启动就开始full gc,短短1分钟可以有几 ...

  9. nfs服务启动失败:Failed to start NFS status monitor for NFSv2/3 locking..

    今天碰到个问题,服务器重启后,nfs服务就启动不了了,关闭都关不了.查看系统日志报下面的错: Aug 10 17:08:53 prod-r3-slt-s-01 systemd: Started Pre ...

  10. 【Storm篇】--Storm基础概念

    一.前述 Storm是个实时的.分布式以及具备高容错的计算系统,Storm进程常驻内存 ,Storm数据不经过磁盘,在内存中处理. 二.相关概念 1.异步: 流式处理(异步)客户端提交数据进行结算,并 ...