欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

mysql decimal类型与decimal长度用法详解 有大用

三者的区别介绍 

 

float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)

double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)

decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)

 

按存储的范围进行排序

 

float(real)

double

decimal(numeric)

 

decimal的详细介绍

 

decimal(a,b)
 

参数说明

a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。
b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。

 

备注

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

 

实例

 

 
SQL 代码   复制        
           
float f = 345.98756f;--结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入。
           
double d=345.975423578631442d;--结果显示为345.975423578631,只显示15个有效位,对最后一位四舍五入。
           
--注:float和double的相乘操作,数字溢出不会报错,会有精度的损失。
           
decimal dd=345.545454879.....--可以支持28位,对最后一位四舍五入。
           
--:当对decimal类型进行操作时,数值会因溢出而报错。
       

 

总结

数值存储范围越小的精度越高,存储数值范围越大,精度就越不准确,如果存储正常金额的情况下,使用money,好处在于可以存储不指定的小数点位数的数值,比较真实。如果对于既要求精度,又固定小数点位数的数值存储,采用decimal(numeric),优点在于可以自定义小数点位数,精度高。如特殊情况,如数值范围巨大只能用float(real)类型了,此类型一般不提倡使用。

来自 http://www.cnblogs.com/zsmynl/p/6927659.html


同事问MySQL数据类型DECIMAL(N,M)中N和M分别表示什么含义,M不用说,显然是小数点后的小数位数,但这个N究竟是小数点之前的最大位数,还是加上小数部分后的最大位数?这个还真记不清了。于是乎,创建测试表验证了一番,结果如下:

测试表,seller_cost字段定义为decimal(14,2)

CREATE TABLE `test_decimal` (
  `id` int(11) NOT NULL,
  `seller_cost` DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf81234
           

起初,表中内容为空

mysql> select * from test_decimal;
Empty set (0.00 sec)12
           

插入整数部分长度为14的数字,报超出列范围的错误

mysql> insert into test_decimal(id,seller_cost) values(1,12345678901234);
ERROR 1264 (22003): Out of range value for column 'seller_cost' at row 112
           

插入整数部分长度为12的数字,可以正确插入

mysql> insert into test_decimal(id,seller_cost) values(1,123456789012);
Query OK, 1 row affected (0.00 sec)12
           

查询表,发现插入的整数值末尾被MySQL补了两位小数“.00”

mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost     |
+----+-----------------+
|  1 | 123456789012.00 |
+----+-----------------+
1 row in set (0.00 sec)1234567
           

继续插入整数部分12位,小数部分5位的数字,可以成功插入,但是有警告,警告表明小数部分发生了截断,被截取成了两位小数

mysql> insert into test_decimal(id,seller_cost) values(1,123456789012.12345);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message                                          |
+-------+------+--------------------------------------------------+
| Note  | 1265 | Data truncated for column 'seller_cost' at row 1 |
+-------+------+--------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost     |
+----+-----------------+
|  1 | 123456789012.00 |
|  1 | 123456789012.12 |
+----+-----------------+
2 rows in set (0.00 sec)12345678910111213141516171819
           

缩小整数部分的长度为2,小数部分的长度继续保持为5,可以成功插入,但小数部分被截断为两位。

mysql> insert into test_decimal(id,seller_cost) values(1,12.12345);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------------------------+
| Level | Code | Message                                          |
+-------+------+--------------------------------------------------+
| Note  | 1265 | Data truncated for column 'seller_cost' at row 1 |
+-------+------+--------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost     |
+----+-----------------+
|  1 | 123456789012.00 |
|  1 | 123456789012.12 |
|  1 |           12.12 |
+----+-----------------+
3 rows in set (0.00 sec)1234567891011121314151617181920
           

继续插入一个小数部分不足两位的数字,可正确插入,且小数部分被自动补全到两位。

mysql> insert into test_decimal(id,seller_cost) values(1,12.1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_decimal;
+----+-----------------+
| id | seller_cost     |
+----+-----------------+
|  1 | 123456789012.00 |
|  1 | 123456789012.12 |
|  1 |           12.12 |
|  1 |           12.10 |
+----+-----------------+
4 rows in set (0.00 sec)12345678910111213
           

综上所述,DECIMAL(N,M)中M值的是小数部分的位数,若插入的值未指定小数部分或者小数部分不足M位则会自动补到M位小数,若插入的值小数部分超过了M为则会发生截断,截取前M位小数。N值得是整数部分加小数部分的总长度,也即插入的数字整数部分不能超过N-M位,否则不能成功插入,会报超出范围的错误。

版权声明:本文为博主原创文章,未经博主允许不得转载。

来自  http://blog.csdn.net/zyz511919766/article/details/49335565

普通分类: