mysql 浮点数补零_一直迷糊的浮点数

之前写了 进制转换,也写了计算机怎么 存整数,那么问题来了,计算机中小数怎么存呢?比如2019.725怎么放到计算机里呢?-2019.725又该怎么办呢?

我们有什么

首先想一下我们有什么,计算机怎么存数。假如我们的计算机是存 32 位的,那么它就长下边的样子。

由于我们写数字,习惯于先写高位,所以把最低位画到了最右边。

我们需要做的就是把0和1放到上边的方框中,来表示2019.725。换言之,我们就是需要制定一个规则,把2019.725转成01字符串存进去。然后读取的时候,再把01字符串转成2019.725显示出来。

思路一

简单粗暴些,我们人为的把32个位置分成三部分,最高位0表示正数,1表示负数,然后是整数部分,再然后是小数部分。

低 10 位存小数部分,接下来的 21 位存整数部分,最高 1位存符号位。所以我们只需要把2019和725分别转成二进制,放进去就可以了。二进制位数不足的,高位补零就可以。

仔细想想,规则还不够完善,如果存10.3和10.03,小数部分怎么存呢?肯定不能都存3,这样两个数就不能区分了。这里我想到两种方案:

倒序

小数部分我们逆转以后去存,10.3小数部分存3,10.03小数部分存30。

补零

我们的小数部分是10个比特位,所以最多存

equation?tex=2%5E%7B10%7D 个数,十进制的话就是0 - 1023。为了方便,把1000以上的数省略掉,范围变成000-999,也就意味着我们能精确的表示小数点后三位的数,如果一个数小数位数不足3位,我们就用零补齐。

10.3的话,可以看成10.300,小数部分存300,10.03的话可以看成10.030,小数部分就存30。

能表示的数字范围

整数部分我们有21个比特位,能表示的数是

equation?tex=2%5E%7B21%7D 个,十进制的话就是 0 - 2097152。

小数部分如果用的倒序方案,那么我们的范围就是0 - 1023。

综上,数字范围就是 -2097152.1023 ~ 2097152.1023。

应用

MySQL 中的定点数DECIMAL就是采取的上边的思想,将整数部分和小数部分分别存储。不同之处是MySQL采用了变字长存储,根据十进制的大小,利用不同的字节去存储,所以理论上它能存的范围是无限的。

思路二

上边的方案有一个问题,表示的数字的范围有些小,最大也才两百多万。限制范围的原因就是,上边的方案整数部分只用了21个比特位去存。

换一种思路,我们通过移动小数点把小数转成整数,然后再记录小数点移动的位数。

我们用3个比特位来记录移动的位数,这样我们就可以把小数点移动7位。此外,整数部分就可以有28个比特位来表示了,范围大大增加。

其实可以看做是科学计数法的形式,比如2019.725,可以看做是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值