PDF 课件和源代码下载地址:
https://github.com/geektime-geekbang/LetsJava
作者回复: 浮点数的精度涉及到浮点数本身的表示形式,理解起来还是略复杂的。简化版大概可以这么理解,在浮点数的世界里,一个具体的二进制的数字,其实表示的是一个范围,比如说下面的三行代码:
System.out.println(Double.toHexString(0.00000000000000000000000000000000000100000000000000021));
System.out.println(Double.toHexString(0.00000000000000000000000000000000000100000000000000022));
System.out.println(Double.toHexString(0.00000000000000000000000000000000000100000000000000032));
它们的输出是一样的
0x1.54484932d2e74p-120
0x1.54484932d2e74p-120
0x1.54484932d2e74p-120
这个意思是这三个数字,转换成浮点数的二进制后其实是一样的。这就是浮点数的精度的直观感受——非常相近的数字,二进制的表示形式是一样的。
就好像电子的轨道一样,不是说电子可以在任意轨道绕着原子核旋转,或者跃迁,光电效应了解一下?电子的轨道只能在固定的满足某个条件的轨道转圈。计算机也一样,不能表示无限精度的数字,只能尽力……
System.out.println(0.00000000000000000000000000000000000100000000000000032 == 0.00000000000000000000000000000000000100000000000000022);
比较也是一样的,正因为浮点数的这种不精确,导致其进行精确的比较是不可靠的,比如上面这两个不一样的数字,其实转换成二进制其实是一样的。输出的结果是true
同样的道理,这种不精确可能会积累,放大,所以浮点数的比较运算,比较推荐的是,求两个数字的差,然后让这个差取绝对值,和一个小到对业务没有影响的值比较,如果比这个值还小,就认为两个浮点数是相等的。
作者回复: StringBuilder 是Java标准类库的一个类, 可以用来高效的拼接字符串.
作者回复: 对,你get到了
作者回复: 编码是国际标准,任意一个字符,都会有一个数字与之对应。可以简单的使用下面几行代码,查看任意一个字对应的数字。
char ch = '编';
int num = ch;
System.out.println(num);
“怎样去做一个其他编制呢”
这个。。。就触及到我知识的盲区了。。。新建一个编码集有点难啊。。。现在一统天下的是Unicode,对应的编码用的最多的是UTF-8。 之前仅仅针对中文字符,有GBK编码集,但是现在一般都会使用UTF-8。
作者回复:
理论知识是,每个字符(无论是特殊字符,标点符号,可见的不可见的)都会被映射为一个数字。很自然的,相同类型的字符都被映射为连续的数字。比如说和我们的汉语字符,在Unicode中都是映射为连续的数字,那么知道这个连续数字的开始和结束,就可以根据字符的对应的数字是否在这个范围内进行过滤了。
我用搜索引擎搜索“java 过滤非汉字字符”,基本上每一篇文章都给出了解决方案。 你提到了正则表达式,我这里给出一个正则表达式的搜索结果仅供参考:
https://blog.csdn.net/tianyinlove/article/details/46971427
作者回复: 这就是制表符的意义。tab就是table,表格。可以帮助对齐字符。这个和编程语言没有关系,文本编辑器也是一样的。你可以打开一个文本编辑器试试看。键盘上tab就是这个字符。在左边shift的上边。