加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql float精度与范围概括

发布时间:2022-06-15 14:26:32 所属栏目:MySql教程 来源:互联网
导读:FLOAT类型用于表示近似数值数据类型,SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围),MySQL还支持可选的只用于确定存储大小的精度规定,0到23的精度对应FLOAT列的4字节单精度,24到53的精度对应DOUBLE列的8字节双精度. mysql中float
  FLOAT类型用于表示近似数值数据类型,SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围),MySQL还支持可选的只用于确定存储大小的精度规定,0到23的精度对应FLOAT列的4字节单精度,24到53的精度对应DOUBLE列的8字节双精度.
 
 
  mysql中float数据类型的问题总结
 
  对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。
 
  FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。
 
  MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。
 
 
  在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)。同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC数据类型的变量形式。M默认值是10。
 
  DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。
 
  二、mysql 和 oracle中的数值类型
 
  问题是不是只有 mysql 存在呢?显然不是,只要是符合IEEE754标准的浮点数实现,都存在相同的问题。
 
  mysql中的数值类型(不包括整型):
 
  IEEE754浮点数:float(单精度),double或real(双精度)
 
  定点数:decimal或numeric
 
  oracle中的数值类型:
 
  oracle 浮点数:number(注意不指定精度)  
 
  IEEE754浮点数:BINARY_FLOAT(单精度),BINARY_DOUBLE(双精度)FLOAT,FLOAT(n) (ansi要求的数据类型)
 
  定点数:number(p,s)
 
  如果在oracle中,用BINARY_FLOAT等来做测试,结果是一样的。因此,在数据库中,对于涉及货币或其他精度敏感的数据,应使用定点数来存储,对mysql来说是 decimal,对oracle来说就是number(p,s)。双精度浮点数,对于比较大的数据同样存在问题!
 
  三、编程中也存在浮点数问题
 
  不光数据库中存在浮点数问题,编程中也同样存在,甚至可以说更值得引起注意!
 
 
  因此,在编程中应尽量避免做浮点数的比较,否则可能会导致一些潜在的问题!除了这些,还应注意浮点数中的一些特殊值,如 NaN、+0、-0、+无穷、-无穷等,IEEE754虽然对此做了一些约定,但各具体实现、不同的硬件结构,也会有一些差异,如果不注意也会造成错误!
 
  四、总结:
 
  从上面的分析,我们可以得出以下结论:
 
  1、浮点数存在误差问题;
 
  2、对货币等对精度敏感的数据,应该用定点数表示或存储;
 
  3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
 
  4、要注意浮点数中一些特殊值的处理.
 
  实例:为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子:
 
  mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
  Query OK, 0 rows affected (0.29 sec)
  mysql> insert into test values(131072.32,131072.32);
  Query OK, 1 row affected (0.07 sec)
  mysql> select * from test;
  +-----------+-----------+
  | c1| c2| --phpfensi.com
 
  在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。
 
  浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;
 
  它的缺点是会引起精度问题。
 
  Float类型和double类型的区别
 
  FLOAT[(M,D)] [ZEROFILL]
 
 
  DOUBLE[(M,D)] [ZEROFILL]
 
  一个正常大小(双精密)浮点数字,不能无符号,允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数,没有一个参数的DOUBLE或FLOAT(X)(25   <   =   X   <   =   53)代表一个双精密浮点数字

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读