数据库技术

mysql8 数据类型 float double decimal

2019-06-08  本文已影响0人  一生悬命Cat

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;

MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。

FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。

做以下实验:
先建表

create table test1 ( 
f float(5,2) default null, 
d double(5,2) default null, 
de decimal(5,2) default null);

Query OK, 0 rows affected (0.04 sec)

desc test1;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| f     | float(5,2)   | YES  |     | NULL    |       |
| d     | double(5,2)  | YES  |     | NULL    |       |
| de    | decimal(5,2) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

测试

mysql> insert into test1 values
(1.23,1.23,1.23),
(1.234,1.234,1.234) ;

Query OK, 2 rows affected, 1 warning (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> select * from test1;
+------+------+------+
| f    | d    | de   |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.23 | 1.23 | 1.23 |
+------+------+------+
2 rows in set (0.00 sec)

数据插入都正确,但是f和d由于标度的限制,舍去了最后一位。
de由于标度限制,舍去了最后一位,出现警告.

这一次我们把精度和标度 全部去掉,再做实验

alter table test1 modify f float;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

alter table test1 modify d double;
Query OK, 2 rows affected (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 0

alter table test1 modify de decimal;
Query OK, 2 rows affected, 2 warnings (0.07 sec)
Records: 2  Duplicates: 0  Warnings: 2
(decimal去掉精度与标度会出现警告);
truncate table test1; //清空表

insert into test1 values(1.23,1.23,1.23);
Query OK, 1 row affected, 1 warning (0.01 sec)


会出现这种情况
select * from test1;
+------+--------------------+------+
| f    | d                  | de   |
+------+--------------------+------+
| 1.23 |               1.23 |    1 |
+------+--------------------+------+
3 rows in set (0.00 sec)
浮点数如果不写精度和标度,则会按照实际显示,
如果有精度和标度,则会将数据四舍五入后插入,
系统不报错,定点数如果不设置精度和标度,
刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会警告!

做运算

mysql> truncate table test1;
Query OK, 0 rows affected (0.04 sec)

mysql> insert test1 values
(1.213,1.456,1.678),(1.4567,1.5678,1.6578),(0.1,0.001,1);

Query OK, 3 rows affected, 2 warnings (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 2

mysql> select * from test1;
+--------+--------+------+
| f      | d      | de   |
+--------+--------+------+
|  1.213 |  1.456 | 1.68 |
| 1.4567 | 1.5678 | 1.66 |
|    0.1 |  0.001 | 1.00 |
+--------+--------+------+
3 rows in set (0.00 sec)

mysql> select sum(f),sum(d),sum(de) from test1;
+-------------------+--------+---------+
| sum(f)            | sum(d) | sum(de) |
+-------------------+--------+---------+
| 2.769700028002262 | 3.0248 |    4.34 |
+-------------------+--------+---------+
1 row in set (0.00 sec)

与mysql5.7有点不同,
5.7的f 、d 都保留了很大串的小数,
mysql8的  d 精度有所提高

上一篇下一篇

猜你喜欢

热点阅读