规格化浮点数又称格式化输出,是指把一个
浮点数按指定的格式进行转换。通常在报表统计展示、数据计算存储时需要格式化,常用的格式化函数有:
format,cast等。
计算机组成原理
若不对
浮点数的表示作出明确规定,同一个浮点数的表示就不是唯一的。例如,
十进制数可以表示成1.11×100,0.111×101,0.0111×102等多种形式。为了提高数据的表示精度,当
尾数的值不为0时,尾数域的最高有效位应为1,这称为浮点数的
规格化表示。否则以修改
阶码同时左右移
小数点位置的办法,使其变为规格化数的形式。
但在
IEEE754标准中,一个规格化的32位浮点数x的真值表示为:
x=(-1)S×(1.M)×2(E-127) (e=E-127) 其中S是浮点数的符号位,占1位。M是尾数,放在低位部分,占用23位,小数点位置放在尾数域最左(最高)
有效位的右边。E是阶码,占用8位。它的尾数域所表示的值是1.M。e为实际指数。因为规格化浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储,而认为隐藏在小数点的左边。
64位的
浮点数中符号位1位,阶码域11位,尾数域52位,指数偏移值是1023.因此规格化的64位浮点数x的真值为
x=(-1)S×(1.M)×2(E-1023) (e=E-1023)
特殊情形
当
阶码E为全0且尾数也为全0时,表示的真值x为零,结合符号位S为0或1,有正零和负零之分。当阶码E为全1且尾数M为全0时,表示的真值x为无穷大,结合符号位S为0或1,也有+∞和-∞之分。这样在32位
浮点数表示中,要除去E用全0和全1(十进制的255)表示零和无穷大的特殊情况,指数的偏移值不选128(10000000),而选127(01111111)。对于规格化浮点数,E的范围变为1到254,真正的指数值e则为-126到+127.因此32位浮点数表示的
绝对值的范围是10-38~1038(以10的幂表示)。
实例一
将
十进制数11.375表示为754标准
存储格式(就是上文提到的一种规格化浮点数的
国际标准)
11.375=+1011.011=+(1.011011)×23=(-1)S×(1.M)×2e
可知S=0,包括隐藏位1的尾数1.M=1.011011=1.011 0110 0000 0000 0000 0000
e=3
E=e+127=130=011+01111111=10000010
0 1000 0010 0110 1100 0000 0000 0000 0000
- ------------- ---------------------------
↑ ↑ ↑
实例二
insert into 浮点数 values(1.00);
insert into 浮点数 values(1.10);
insert into 浮点数 values(1.021);
insert into 浮点数 values(1.01);
insert into 浮点数 values(100.2);
insert into 浮点数 values(0.586);
insert into 浮点数 values(299.999);
insert into
浮点数 values(53.000);
insert into 浮点数 values(35003.12);
.mode column
.h on
select * from 浮点数;
浮点数
----------
1.0
1.1
300
1.021
1.01
100.2
0.586
299.999
53.0
35003.12
--输入整数,保存整数,输入小数,如果
小数点后边都是零,只保留一个零。
select
浮点数, round(浮点数,2)四舍五入from 浮点数;
---------- ------------
1.0 1.0
1.1 1.1
300 300.0
1.021 1.02
1.01 1.01
100.2 100.2
0.586 0.59
299.999 300.0
53.0 53.0
35003.12 35003.12
select round(
浮点数,2),LENGTH(ROUND(浮点数,2))-LENGTH(CAST(浮点数 AS INTEGER)) from 浮点数;
round(浮点数,2) LENGTH(ROUND(浮点数,2))-LENGTH(CAST(浮点数 AS INTEGER))
------------------ ------------------------------------------------------
1.0 2
1.1 2
300.0 2
1.02 3
1.01 3
100.2 2
0.59 3
300.0 2
53.0 2
35003.12 3
0.5 2
--
四舍五入后的位数长度减去取整后的位数长度行规教徒等于2的需要加一个零.
sqlite> SELECT
浮点数 AS 'raw value', (ROUND(浮点数,2)) AS 'RND value' , CASE WHEN (LENGTH(ROUND(浮点数,2))) - (LENGTH(CAST(浮点数 AS INTEGER)) ) =2 THEN SUBSTR(' '||(ROUND(
浮点数,2))||'0',
-10,10) ELSE SUBSTR(' '||(ROUND(浮点数,2 )),-10,10) END AS 'result' FROM 浮点数;
raw value RND value result
---------- ---------- ----------
1.0 1.0 1.00
1.1 1.1 1.10
300 300.0 300.00
1.021 1.02 1.02
1.01 1.01 1.01
100.2 100.2 100.20
0.586 0.59 0.59
299.999 300.0 300.00
53.0 53.0 53.00
35003.12 35003.12 35003.12
0.5 0.5 0.50
格式化输出
又称格式化
浮点数,是指把一个浮点数按指定的格式进行转换。
比如有一个
浮点数2.102586,当用它来表示个数时,就要取掉小数部分,格式化为2;当用它来表示金额时,通常只保留2位小数,按
四舍五入格式化为2.10或者按
进一法格式化为2.11。
通常在报表统计展示、数据计算存储时需要格式化,常用的格式化函数有:
format,cast等。