MySQL中的float和decimal类型_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2061 | 回复: 0   主题: MySQL中的float和decimal类型        下一篇 
Irvinna
注册用户
等级:新兵
经验:51
发帖:46
精华:0
注册:2011-8-19
状态:离线
发送短消息息给Irvinna 加好友    发送短消息息给Irvinna 发消息
发表于: IP:您无权察看 2014-11-18 11:27:47 | [全部帖] [楼主帖] 楼主

float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的,用于定义货币要求精确度高的数据。在数据迁移中,float(M,D)是非标准定义,最好不要这样使用。M为精度,D为标度。 

www.2cto.com
mysql> create table t1(c1 float(10,2), c3 decimal(10,2));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t1 values(1234567.23, 1234567.23);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------------+------------+
| c1 | c3 |
+------------+------------+
| 1234567.25 | 1234567.23 |
+------------+------------+
1 row in set (0.02 sec)
mysql> insert into t1 values(9876543.21, 9876543.12);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> select * from t1;
+------------+------------+
| c1 | c3 |
+------------+------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
+------------+------------+
2 rows in set (0.00 sec)


不定义fload, double的精度和标度时,存储按给出的数值存储,这于OS和当前的硬件有关。 

decimal默认为decimal(10,0) 

因为误差问题,在程序中,少用浮点数做=比较,可以做range比较。如果数值比较,最好使用decimal类型。 

精度中,符号不算在内: 

mysql> insert into t1 values(-98765430.21, -98765430.12);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+--------------+--------------+
| c1 | c3 |
+--------------+--------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
| -98765432.00 | -98765430.12 |
+--------------+--------------+
3 rows in set (0.00 sec)


float占4个字节,double占8个字节,decimail(M,D)占M+2个字节。 

decimal 类型可以精确地表示非常大或非常精确的小数。大至 1028(正或负)以及有效位数多达 28 位的数字可以作为 decimal类型存储而不失其精确性。该类型对于必须避免舍入错误的应用程序(如记账)很有用。   www.2cto.com  

float是浮点数,不能指定小数位。 

decimal是精确数,可以指定精度。 

对mysql 5来说 decimal(p,s)中p最大为65,S最大为30 

decimal数据类型最多可存储 38 个数字,它存储了一个准确(精确)的数字表达法,不存储值的近似值。 

当数据值一定要按照指定精确存储时,可以用带有小数的decimal数据类型来存储数字。 

float和real数据类型被称为近似的数据类型。不存储精确值.当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。 

在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用float或real列。最好限制使用float和real列做> 或 < 的比较。 

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论