龙空技术网

《Core Java》阅读与拓展 第三章Java的基本程序设计结构

甜橙很酸 131

前言:

目前朋友们对“oracle一年中的第几天”大体比较关切,大家都需要了解一些“oracle一年中的第几天”的相关知识。那么小编也在网络上网罗了一些对于“oracle一年中的第几天””的相关内容,希望小伙伴们能喜欢,你们一起来学习一下吧!

原书内容概括格式化输出

public PrintStream printf(String format, Object ... args)

%[argument_index$][flags][width][.precision]conversion,其中[]表示可选。

%:格式说明符

[argument_index$] :格式化的参数的索引.索引从1开始

[flags]:转换符,指示被格式化的数值类型

[width:]要输出的字符数

[.precision]:小数点后的位数

conversion:标志符,控制格式化输出的形式。

转换符列举

%n  换行,相当于 \n

%c  单个字符

%d  十进制整数

%u  无符号十进制数

%f  十进制浮点数

%o  八进制数

%x  十六进制数

%s  字符串

%%  输出百分号

标志符列举

+ 打印正数和负数

0 数字前面补0

- 左对齐

, 添加分组分隔符

例子:

1)System.out.printf(“%05.5f”,10000/9)

结果:1111.11108

System.out.printf(“%15.5f”,10000/9)

结果: 1111.11108(注意有空格)

System.out.printf(“%015.5f”,10000/9)

结果:000001111.11108

System.out.printf(“%0,15.5f”,10000/9)

00001,111.11108

更多信息参照:

对于日期的格式化,有如下的转换符:

a 日期中星期简称

A 日期中星期全称

b 日期中月份的简称

B 日期中月份的全称

C 日期中年份的前两位数

y 日期中年份的后两位数

Y 日期中年份的完整表示

D “年/月/日”格式

F “年-月-日”格式

j 一年中的第几天

m 日期中的月份,两位数字表示,不足两位补零

d 日期中的日,两位数字表示,不足两位补零

e 日期中月份的日,不补零

T “HH:MM:SS” 格式(24小时)

r “HH:MM:SS PM”格式(12小时)

R “HH:MM”格式(24小时)

以%t开头加上述转换符,例如:

System.out.printf("%1$tF %1$tT",new Date());

结果:2012-05-13 12:37:40

拓展1 用十六进制表示浮点数

转换规则:

先将十进制数转换为aPn的形式,然后转换为0xApn的形式。

0x指出为十六进制,将a转换为十六进制并加小数点后跟一个0,p表示指数。

例:0.25=1/4=1*2-2 可以表示为0x1.0p-2

因为0.25=2*2-3,还可以这样表示:0x2.0p-3

2 常量赋值

一般常量赋值方式:

1)在声明时赋值

2)在构造器中赋值

3)在构造代码块中赋值

对于静态常量,赋值方式有:

1)在声明时赋值

2)在静态代码块中赋值

3 Math与StrictMath

StrictMath保证在不同的平台上得到相同的结果。它使用了“自由发布的数学库fdlibm”,这些算法都是用 C 编程语言编写的,并且因为它们能遵从Java浮点算法的规则,与所有浮点运算一同执行。

所以我们会看到StrictMath中大多数方法都被native修饰。

4 int与float互转精度丢失分析

要弄懂这个问题首先要了解IEEE754标准。

IEEE754标准对十进制浮点数如何转换为二进制格式做出了规定。

IEEE754规定了四种浮点格式:单精度,双精度,单精度扩展,双精度扩展。单精度为32位,双精度为64位。

Java中float指单精度浮点类型,下面说明单精度格式的表示。

sign:符号,表示浮点数的正负,0表示正数,1表示负数。

exponent:偏移指数

fraction:尾数

将实数转换为IEEE754规定的二进制格式,步骤如下:

a)将实数转换为二进制形式

整数部分除2取余,小数部分乘2取整。

b)用科学计数法表示二进制

aEn

三部分a,E,n如何确定?

a由实数转换成二进制后,将小数点移动到第一个1后面,我们就得到了a。

E这里是固定值,即2。

n是小数点移动的位数。

c)第31位填充0(正数)或1(负数).

d)计算偏移指数

m=n+127

将m转换为二进制数M,则偏移指数为M。

注意:对于单精度类型,偏移量是127,对于双精度类型,偏移量是1023。

e)计算尾数

将上述计算所得a的小数点及前面的1去掉,如果不足23,低位填0占位。

有了上面的基础看看精度丢失的问题。

int类型为32位,其中一位是符号位,其余31位决定了其表达的范围;对于float类型,尾数决定了浮点数的精度,而尾数只有23。尾数的23位加上显示的1位,能够表达的最大十进制数为224-1,即16777215。

现在看几个数的二进制科学计数法表示:16777215,16777216,16777217,16777218。

16777215(十进制)

=111111111111111111111111(二进制)

=1.11111111111111111111111 × 223(科学计数法)

16777216(十进制)

=1000000000000000000000000(二进制)

=+1.0 × 224(科学计数法)

根据ieee754规范,尾数只能是23位,所以是将16777216二进制数的最后一位0舍弃。虽有舍弃,但舍弃的是0,所以没有精度丢失。

16777217(十进制)

=1000000000000000000000001(二进制)

=1.000000000000000000000001× 224(科学计数法)

根据ieee754规范,尾数只能是23位,所以是将16777217二进制数的最后一位1舍弃,因此造成精度丢失。

16777218(十进制)

=1000000000000000000000010(二进制)

=1.000000000000000000000010 × 224(科学计数法)

根据ieee754规范,尾数只能是23位,所以是将16777218二进制数的最后一位0舍弃。虽有舍弃,但舍弃的是0,所以没有精度丢失。

由以上计算结果看出精度是如何丢失的。

5 Unicode与utf8

Unicode将每个字符映射到一个唯一的数。它并没有给出字符的存储方式。

utf8是Unicode的两种实现方案,除此之外还有utf16和utf32。

utf8使用1到4个字节进行编码,Unicode编号越小使用的字节数越少。

utf8编码规则为:

1)对于单字节的字符,字节的第一位设为0,后面的7位为这个字符的Unicode码,因此对于英文字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的字符(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,剩下的没有提及的二进制位,全部为这个字符的Unicode码 。

按照下表,找到对应的范围,将字符的Unicode编码转换为二进制,最后用二进制的位替换表中的x即得utf8编码。注意,在这个表中,符号范围用十六进制数表达。

Unicode符号范围 | UTF-8编码方式

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

举例:汉字算的utf8编码

算的Unicode码为U+7b97,7b97在0000 0800-0000 FFFF范围内,所以编码方式为 1110xxxx 10xxxxxx 10xxxxxx,将7b97转换成二进制数:111101110010111,不足16位高位补0:0111 1011 1001 0111。最终等到utf8编码:11100111 10101110 10010111

标签: #oracle一年中的第几天