小数数据类型float

1.1 float的总结

1

#### 格式
id     float(M,D)                         unsigned                 zerofill
字段名  数据类型(建表地要指定M和D,根据你的业务)  无符号(整数位只能是正整数)   无符号(包含unsigned,整数位    不会前导0填充)

#### float的M和D说明和示例
M:表示"整数位""小数位"共多少位,M最大255位(包含小数位在内,小数30位),所以整数位最大长度是225;
D:表示"小数位"最大多少位,最大30位;
示例1:float(255,30)   # 整数位最大长度225位,小数位最大长度30位;
示例2:float(50,20)    # 整数位最大长度30位,小数位最大长度20位;


#### float关于小数的四舍五入(看一看小数位的最大精度)
例1:f float(255,30)  例2:f float(255,30) unsigned  例3:f float(255,30) zerofill
插入数据:insert into test12(f) values(1.555555555555555555555555555555);
        # 结果是:1.555555582046508800000000000000
        # 可以看出小数位的第8位就不准确了,只准确到了第7位小数位;

####  unsigned/zerofill实践(且为float指定整数位和小数位长度)
例1:f float(5,2) unsigned      例2:f float(5,2) zerofill
说明点一:float(5,2)
01:f字段的值的"整数位"最大长度是3位,"小数位"的长度最大是2位;
02:只要"整数位"的长度超过3位(sql_mode严格模式,直接报错;sql_mode未严格,警告,到表中的数据是999.99)
03:若只有"小数位"的长度超过2位(小数会根据第3位进行四舍五入,但小数最终只显示2位,不管你的sql_mode是否开启严格模式)
04:若"小数位"的长度不够2位时,在"小数位"后面用0填充来显示

说明点二:unsigned和zerofill
01:表示f字段的值的"整数位"只能是"正整数"
02:当有zerofill时,不管sql_mode有没有开启严格模式,"整数位"的长度都不会前导0填充显示


####  无unsigned/zerofill(且为float指定整数位和小数位长度)
例1:f float(5,2)
说明点一:float(5,2)
01:f字段的值的"整数位"最大长度是3位,"小数位"的长度最大是2位;
02:只要"整数位"的长度超过3位(sql_mode严格模式,直接报错;sql_mode未严格,警告,到表中的数据是999.99)
03:若只有"小数位"的长度超过2位(小数会根据第3位进行四舍五入,但小数最终只显示2位,不管你的sql_mode是否开启严格模式)
04:若"小数位"的长度不够2位时,在"小数位"后面用0填充来显示

说明点二:无unsigned和zerofill
表示f字段的值的"整数位"可以是"正整数""负整数"

1.2 实践一(看一看float的小数位精确度)

总结

字段定义:f float(255,30)  
插入数据:insert into test13(f) values(1.555555555555555555555555555555);
          # 结果是:1.555555582046508800000000000000
          # 可以看出小数位的第8位就不准确了,只准确到了第7位小数位;

实践

## 创建test12表
create table if not exists test12(
	f float(255,30)
)engine=innodb character set utf8 collate utf8_general_ci comment"测试表12";

## 查看tst12表的表结构
mysql> desc test12;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| f     | float(255,30) | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.00 sec)

## 插入测试数据
mysql> insert into test12(f) values(1.555555555555555555555555555555);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test12;
+----------------------------------+
| f                                |
+----------------------------------+
| 1.555555582046508800000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

1.3 实践二(float指定M和D,加unsigned)

SQL模式开启了严格模式

## 设置当前会话模式下sql_mode包含严格模式(即包含STRICT_TRANS_TABLES变量)
mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode\G
*************************** 1. row ***************************
@@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

## 创建test13_1表
create table if not exists test13_1(
  f float(5,2) unsigned
)engine=innodb character set utf8 collate utf8_general_ci comment"测试表13_1";

   ## 说明点一:float(5,2)
    01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
    02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
    03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;

    04:只要整数位的长度超过3时,会直接报错(因为sql_mode开启了严格模式),数据不会到表中
    05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位

    ## 说明点二:unsigned
    因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";

## 查看test13_1表的表结构
mysql> desc test13_1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| f     | float(5,2) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)


## 插入数据测试"说明点一"和"说明点二"
insert into test13_1(f) values(17.5);    # 结果:17.50
insert into test13_1(f) values(170.50);  # 结果:170.50
insert into test13_1(f) values(170.56);  # 结果:170.56
insert into test13_1(f) values(170.566); # 结果:170,57(小数位第3位的6四舍五入)
insert into test13_1(f) values(1777.56); # 报错(sql_mode开启了严格模式),数据不会到表中

## 查看test13_1表中的全部数据
mysql> select * from test13_1;
+--------+
| f      |
+--------+
|  17.50 |
| 170.50 |
| 170.56 |
| 170.57 |
+--------+
4 rows in set (0.00 sec)

SQL_MODE未开启严格模式

## 设置当前会话模式下sql_mode不包含严格模式(即不包含STRICT_TRANS_TABLES变量)
mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode\G
*************************** 1. row ***************************
@@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

## 创建test13_2表
create table if not exists test13_2(
  f float(5,2) unsigned
)engine=innodb character set utf8 collate utf8_general_ci comment"测试表13_2";

    ## 说明点一:float(5,2)
    01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
    02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
    03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;

    04:若要整数位的长度超过3时,不会直接报错(因为sql_mode未开启了严格模式),最终到表中的数据是999.99
    05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位

    ## 说明点二:unsigned
    因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";
  
## 查看test13_2表的表结构
mysql> desc test13_2;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| f     | float(5,2) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

## 插入数据测试"说明点二"和"说明点三"
insert into test13_2(f) values(17.5);     # 结果:17.50
insert into test13_2(f) values(170.50);   # 结果:170.50
insert into test13_2(f) values(170.56);   # 结果:170.56
insert into test13_2(f) values(170.566);  # 结果:170,57(小数位第3位的6四舍五入)
insert into test13_2(f) values(1777.56);  # 警告(sql_mode未开启了严格模式),到表中的数
# 据为999.99

## 查看test13_2表中的全部数据
mysql> select * from test13_2;
+--------+
| f      |
+--------+
|  17.50 |
| 170.50 |
| 170.56 |
| 170.57 |
| 999.99 |
+--------+
5 rows in set (0.00 sec)

1.4 实践三(float指定M和D,加zerofill))

SQL_MODE开启了严格模式

## 设置当前会话模式下sql_mode包含严格模式(即包含STRICT_TRANS_TABLES变量)
mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode\G
*************************** 1. row ***************************
@@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

## 创建test14_1表
create table if not exists test14_1(
  f float(5,2) zerofill
)engine=innodb character set utf8 collate utf8_general_ci comment"测试表14_1";

    ## 说明点一:float(5,2)
    01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
    02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
    03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;

    04:只要整数位的长度超过3时,会直接报错(因为sql_mode开启了严格模式),数据不会到表中
    05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位

     ## 说明点二:unsigned
    因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";

## 查看test14_1表的表结构
mysql> desc test14_1;
+-------+------------------------------+------+-----+---------+-------+
| Field | Type                         | Null | Key | Default | Extra |
+-------+------------------------------+------+-----+---------+-------+
| f     | float(5,2) unsigned zerofill | YES  |     | NULL    |       |
+-------+------------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)


## 插入数据测试"说明点一"和"说明点二"
insert into test14_1(f) values(17.5);    # 结果:17.50
insert into test14_1(f) values(170.50);  # 结果:170.50
insert into test14_1(f) values(170.56);  # 结果:170.56
insert into test14_1(f) values(170.566); # 结果:170,57(小数位第3位的6四舍五入)
insert into test14_1(f) values(1777.56); # 报错(sql_mode开启了严格模式),数据不会到表中

## 查看test14_1表中的全部数据
mysql> select * from test14_1;
+--------+
| f      |
+--------+
|  17.50 |
| 170.50 |
| 170.56 |
| 170.57 |
+--------+
4 rows in set (0.00 sec)

SQL_MODE未开启严格模式

## 设置当前会话模式下sql_mode不包含严格模式(即不包含STRICT_TRANS_TABLES变量)
mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode\G
*************************** 1. row ***************************
@@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1 row in set (0.00 sec)

## 创建test14_2表
create table if not exists test14_2(
  f float(5,2) zerofill
)engine=innodb character set utf8 collate utf8_general_ci comment"测试表14_2";

    ## 说明点一:float(5,2)
    01:f字段指定了float(5,2),"整数位"最大长度最大3位,"小数位"最大长度2位
    02:当整数位的长度不够3位长度时,不会前导0填充进行显示,加zerofill也不会前导0填充
    03:当小数位的长度不够2位长度时,不会前导0填充进行显示,会在小数后用0补充来显示;

    04:若要整数位的长度超过3时,不会直接报错(因为sql_mode未开启了严格模式),最终到表中的数据是999.99
    05:若只有小数位的长度超过2时,会根据小数位的第3位进行四舍五入,但最终显示的还是2位

    ## 说明点二:unsigned
    因为加了无符号(unsigne)限制,所以f字段的值的整数位只能是"正整数";
  
## 查看test14_2表的表结构
mysql> desc test14_2;
+-------+------------------------------+------+-----+---------+-------+
| Field | Type                         | Null | Key | Default | Extra |
+-------+------------------------------+------+-----+---------+-------+
| f     | float(5,2) unsigned zerofill | YES  |     | NULL    |       |
+-------+------------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

## 插入数据测试"说明点二"和"说明点三"
insert into test14_2(f) values(17.5);     # 结果:17.50
insert into test14_2(f) values(170.50);   # 结果:170.50
insert into test14_2(f) values(170.56);   # 结果:170.56
insert into test14_2(f) values(170.566);  # 结果:170,57(小数位第3位的6四舍五入)
insert into test14_2(f) values(1777.56);  # 警告(sql_mode未开启了严格模式),到表中的数
# 据为999.99

## 查看test14_2表中的全部数据
mysql> select * from test14_2;
+--------+
| f      |
+--------+
|  17.50 |
| 170.50 |
| 170.56 |
| 170.57 |
| 999.99 |
+--------+
5 rows in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值