一个复习中发现的Java问题
自认为接触了这么多年的Java,考点小考试应该问题不大,但是一复习起来做起题,发现问题多多。特别是一个关于DecimalFormat的问题,几乎耗费了两个小时。这些都是以前完全不关心的东西,把这些点小小的总结一下可算是查漏补缺。
DecimalFormat
大家都很熟悉在println中通过各种形式来规定输出格式,DecimalFormat也是一个相似的功能,服务于各种数据。其最基本的几个替换符为:
0 — 代替所有的0-9的数字,必须出现
# — 代替除0外的1-9数字,0的时候不出现
. — 小数点
E — 指数符号
% — 百分号
,– 用来分组的占位符,在西方表达中常见如1,234,568
还有一些,不列出来了,自己可以再文档中查到。我主要想说以下关于前四个最基本的组合。
给出一个数字67890.78987这个数字基本上可以吧我要提到的问题都囊括在里面。
首先前面的示例性的生成Pattern就几乎省略了,DecimalFormat df = new DecimalFormat(”/*这个里面插入你的模式*/”);
模式 结果 注释
0000.0000 67890.7899 0代表必须有的位数,小数点4位,小数点后4位。由于实际中小数点前比4位多,保留。小数点后比5位多,自动进位,四舍五入。
00000.000 67890.790 小数点后有3位,同时后面进位,所以变为790
000000.000 067890.790 小数点前有6位,实际数字只有5位,所以最前面一位必须用0补齐。
0000.000000 67890.789870 小数点后有6位,实际数字只有5位,用0补齐
####.#### 67890.7899 同样小数点前最多4位,小数点后最多4位。同样因为实际数字小数点前比4位多,保留。后面四舍五入。
####.### 67890.79 小数点后最多3位,应该是790,但是由于是#,所以0可以去掉。
######.### 67890.79 小数点前最多6位,实际为5位,第一位补0,去掉。
####.###### 67890.78987 小数点后最多6位,实际为5位,最后一位补0,去掉。
##0.00# 67890.79 在0和#组合中,仍然符合以上规则。小数点后最后一位补0,是#,去掉。
科学技术法的判断位数方法和前面的有所不同。首先,小数点前面的位数和小数点后的位数代表的都不再是实际看到的小数点前后的位数,而是后面的实际数字的情况。在最大整数位比最小整数位差距在1之上的情况下,E的指数大小为小数点前最多位数的整数倍。但是尾数的位数是最大整数尾数和最大小数位数之和。
000000.##E0 67890.79–678907.9E-1
00000.##E0 67890.79–67890.79E0 小数点前5位,尾数一共5+2=7位。指数为0。
#0000.##E0 67890.79–67890.79E0 同上
##000.##E0 67890.79–67890.79E0 小数点前最小3位,和本来5位差距在1之上,因此指数为5的倍数。
0000.##E0 67890.79–6789.08E1 小数点前4位,尾数一共4+2=6位。指数为1。
#000.##E0 67890.79–6.78908E4 小数点前最小3位,和本来5位差距在1之上,因此指数为4的倍数。
##00.##E0 67890.79–6.78908E4 小数点前最小2位,和本来5位差距在1之上。
000.##E0 67890.79–678.91E2
#00.##E0 67890.79–67.891E3 小数点前最小2位,和本来5位差距在1之上,指数为3的倍数。
##0.##E0 67890.79–67.891E3
00.##E0 67890.79–67.89E3
#0.##E0 67890.79–6.789E4
##.##E0 67890.79–6.789E4
0.##E0 67890.79–6.79E4
#.##E0 67890.79–6.79E4
This entry was posted on Wednesday, June 10th, 2009 at 8:53 pm and is filed under J2SE . You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.



