第一篇文章:html
mysql> create table t1(id1 float(5,2) default null,id2 double(5,2) default null,
id3 decimal(5,2) default null );mysql
mysql> insert into t1 values(1.2345,1.2345,1.2345);
Query OK, 1 row affected, 1 warning (0.04 sec)git
mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Note | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)sql
实数是带有小数部分的数字。然而,它们不仅是为了存储小数部分,也可使用DEClMAL 存储比 BIGINT还大的整数。 MySQL 既支持精确类型,也支持不精确类型。FLOAT 和 DOUBLE 类型支持使用标准的浮点运算进行近似计算。若是须要知道浮点运算是怎么计算的,则须要研究所使用的平台的浮点数的具体实现。 服务器
DECIMAL 类型用于存储精确的小数。在 MySQL 5.0 和更高版本, DECIMAL 类型支持精确 计算。 MySQL 4.1 以及更早版本则使用浮点运算来实现 DECIAML 的计算,这样作会由于 精度损失致使一些奇怪的结果。在这些版本的MySQL 中,DEClMAL 只是一个"存储类型"。网络
由于 CPU 不支持对 DEClMAL 的直接计算,因此在 MySQL 5.0 以及更高版本中, MySQL 服务器自身实现了 DECIMAL 的高精度计算。相对而言, CPU 直接支持原生浮点计算,所 以浮点运算明显更快。post
浮点和 DECIMAL 类型均可以指定精度。对于 DECIMAL 列,能够指定小数点先后所容许的 最大位数。这会影响列的空间消耗。 MySQL 5.0 和更高版本在内部把定点数保存为二进制格式:先把定点数分红小数点前面和小数点后面两部分,并为它们各自分配4个字节,这4个字节最多能够表示9个数字(nine digits)。也就是说,DECIMAL(6,3)和 DECIMAL(18,9)都将占用9个字节(小数点自己占一个字节)。若是还有多出来的数字,存储须要的字节以下:ui
Leftover Digits | Number of Bytes |
---|---|
0 | 0 |
1–2 | 1 |
3–4 | 2 |
5–6 | 3 |
7–9 | 4 |
MySQL 5.0 和更高版本中的 DEClMAL 类型容许最多 65个数字。而早期的 MySQL 版本中 这个限制是254个数字,而且保存为未压缩的字符串(每一个数字一个字节)。然而,这些(早 期)版本实际上并不能在计算中使用这么大的数字,由于 DECIMAL 只是一种存储格式: 在计算中 DEClMAL 会转换为 DOUBLE 类型。url
有多种方法能够指定浮点列所须要的精度,这会使得 MySQL 悄悄选择不一样的数据类型, 或者在存储时对值进行取舍。这些精度定义是非标准的,因此咱们建议只指定数据类型, 不指定精度。spa
浮点类型在存储一样范围的值时,一般比 DECIMAL 使用更少的空间。 FLOAT 使用 4个字 节存储。 DOUBLE 占用8个字节,相比 FLOAT有更高的精度和更大的范围。和整数类型同样, 能选择的只是存储类型 IMySQL 使用 DOUBLE 做为内部浮点计算的类型。
由于须要额外的空间和计算开销,因此应该尽可能只在对小数进行精确计算时才使用DECIMAL一一例如存储财务数据。但在数据量比较大的时候,能够考虑使用 BIGINT 代替DECIMAL,将须要存储的货币单位根据小数的位数乘以相应的倍数便可。假设要存储财务数据精确到万分之一分,则能够把全部金额乘以一百万,而后将结果存储在 BIGINT里,这样能够同时避免浮点存储计算不精确和 DECIMAL 精确计算代价高的问题。
第三篇文章,官方文档
https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html