跳至主要內容

Mysql中的Decimal类型说明

Mr.Liu大约 3 分钟数据库MySQLSQL

我们在Mysql中存字段的时候,比如,一些与金钱有关的数据。这个时候就会对精确到的要求非常高。那么这个时候,就会发现我们之前所学的八大基本类型不再能够满足需求,无论是整形还是浮点型,有人会说存整形有什么不可,但是你要知道不是每个人的金额都是整数的;这样不行的话,存浮点型的就可以了嘛,对于银行存钱来说,一个小数点的问题都会将一笔钱的金额变得很大或者很小......So,这个时候你可以尝试一下Decimal类型,你会发现能够很好地解决你的问题。

decimal详细介绍:

decimal(a,b)

  • 参数说明:

    • a:指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度为38.

    • b:指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0~a之间的值,默认小数位数是0.

  • 举例说明,11615.23653234568这个数存你说的三个格式

    • decimal:11615
    • decimal(3):999
    • decdimal(3,2):9.99
    • decimal(10,5)11615.23653 超出精度范围的数会被强制进位并只显示数据类型定义的格式
  • 备注:

    decimal数据类型用于要求非常高的精确计算中,这些类型允许指定数值的精确度和计算方法作为选择参数。精确度在这里指为这个值保存的有效数字的总个数。而计数方法指的是小数点后数字的个数。例如:decimal(5,2)规定了存储的值将不会超过五位数字 ,而且小数点后面有两位数字。

实例1:

mysql> create table t1(c1 float(10,2), c3decimal(10,2));

Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values(9876543.21, 9876543.12);

Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;

+------------+------------+
| c1         | c3         |
+------------+------------+
| 9876543.00 | 9876543.12 |
+------------+------------+
1 row in set (0.00 sec)

      会发现,flocat类型的字段会自动将值四舍五入,而decimal类型的不会,如果用flocat类型的去存与金额有关的数据的时候就会出现问题,而decimal类型的就不会。

实例2:decimal(5,2)

mysql> create table t1(id1 float(5,2) default null,id2 double(5,2) default null,
id3 decimal(5,2) default null );
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t1 values(1.2345,1.2345,1.2345);
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message                                  |
+-------+------+------------------------------------------+
| Note  | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)
  • 1.2345 --- 小数点后最多2位,所以保存可以,自动四舍五入数据截断,但会报waning

  • 12.34 --- OK

  • 1234.5 --- 因为小数部分未满2位,要补0.所以保存应该1234.50。所以整个位数超出了5,保存报错。

  • 1.2 --- 小数未满部分补0。按照1.20保存。

默认状态比较:

  • 浮点数
    • 如果不写精度和标度,会按照实际精度值保存
    • 如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错
  • 定点数
    • 如果不写精度和标度,则按照默认值decimal(10,0)来操作
    • 如果数据超过了精度和标度值,系统会报错