Double类型只用8字节存储但范围为什么那么大

Double类型只用8字节存储但范围为什么那么大

double类型一般由:符号位、指数位、尾数构成。其中尾数位决定精度。

ODPS的Double描述:
类型     描述                 取值范围
Double   8字节双精度浮点数。  -1.0E308 ~ 1.0E308

Double用8字节双精度浮点数
1.0E+38
1.0乘以10的308次方,为什么会这么大?64位能表示的最大不应该是2^64吗?

1,因为double类型是浮点数,这种类型可以用科学记数法表示,所以表示范围非常大。
但是,使用可浮点数的代价就是损失了精度。它把这部分精度用于指数的表示。
所以double类型的优点就是数据范围大,缺点是精度不足,大概只有15~16位有效位数。

2,它表示大数的代价就是损失了精度。举个例子:假设我有0-9这10个数,我定义数n表示5n,那么这10个数最大能表示5*9=45。
能表示的范围是:0、5、10、15、20、25、30、35、40、45。最小值为0,最大值为45。所以表示的范围是:0~45。
但1、2、3、4,......,41,42,43,44这些不是5的倍数的数就没法精确表示了,只能在定义中把它们靠向0、5、......、40或者45。
这就是为了扩大表示范围而损失了表示精度。

Oracle NUMBER类型的最大字符个数是38
所以,Oracle NUMBER能表示的最大整数为:a = 99999999999999999999999999999999999999(38个9)
如果转换成DOUBLE,会丢失精度,用DOUBLE存储以后,实际的结果为:b = 1E38 即 10^38 = 100000000000000000000000000000000000000

显然:a ≈ b
但b不是我们期待的值,除非实际应用场景能够认可。
所有Oracle NUMBER不能简单的转为DOUBLE存储,会丢失精度。

你可能感兴趣的:(数据库,开发,常见问题)