
float,double的存储数据精度是根据占用的位数决定的三种字符类型的占用位数如下:
float 浮点类型 类型占用32位 1 符号位 8 指数位 23 尾数位
double 浮点类型 类型占用64位 1 符号位 11 指数位 52 尾数位
float 类型的数再转为二进制的科学记数法时 +/- 1.xxx * 2 ^ +/- yyyy
X(尾数位) 所以精确度就变成了23+1位,因为任何二进制的科学记数法都会表示为1.xxx*2^n Y(指数位-1因为有一个符号为即2的负指数幂)
log10(2^24)=7.2247198959355486851297334733878 所以float可以表示的十进制数的精确有效位是7位 即最大时1000000
测试一下:
CREATE TABLE `float_test` (`id` float DEFAULT NULL) ENGINE=InnoDB ;
mysql> insert into float_test values(999999);
mysql> insert into float_test values(1000000);
mysql> insert into float_test values(1000001);
mysql> select * from float_test;
+---------+
| id |
+---------+
| 999999 |
| 1000000 |
| 1000000 |
+---------+
另外 要得到1位小数的话,整数不能高于5位。
要得到2位小数的话,整数不能高于4位
要得到3位小数的话,整数不能高于3位
要得到4位小数的话,整数不能高于2位
要得到5位小数的话,整数不能高于1位
要得到6位小数的话,整数不能高于0位
小数最多七位其实是0.1000000
同理可以计算double的精确度整数最多16位,小数最多16位(0.1000000000000000)
decimal 不动点类型 对多存储65位数字
本想温习一下,往深一看发现还是有很多知识欠缺,如有错误之处还请大家多多指点