前言:
目前朋友们对“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一年中的第几天