FLOAT类型用于表示近似数值数据类型。SQL标准 允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应 FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。

单精度浮点数用4字节(32bit)表示浮点数
采用IEEE754标准的计算机浮点数,在内部是用二进制表示的
如:7.22用32位二进制是表示不下的。
所以就不精确了。
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。
MySQL将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词。MySQL还将REAL视为DOUBLE PRECISION(非标准扩展)的同义词,除非SQL服务器模式包括REAL_AS_FLOAT选项。
为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数。
DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:
salary DECIMAL(5,2)
在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。
在MySQL 5.1中以二进制格式保存DECIMAL和NUMERIC值。
标准SQL要求salary列能够用5位整数位和两位小数保存任何值。因此,在这种情况下可以保存在salary列的值的范围是从-999.99到999.99。
在标准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)。双精度浮点数,对于比较大的数据同样存在问题!
三、编程中也存在浮点数问题
不光数据库中存在浮点数问题,编程中也同样存在,甚至可以说更值得引起注意!
通过上面的介绍,浮点数的误差问题应该比较清楚了。如果在程序中做复杂的浮点数运算,误差还会进一步放大。因此,在程序设计中,如果用到浮点数,一定要意 识到可能产生的误差问题。不仅如此,浮点数如果处理不好,还会导致程序BUG!看下面的语句:if (x != y) { z = 1 / (x -y);}这个语句看起来没有问题,但如果是浮点数,就可能存在问题!再看下面的语句会输出什么结果: public class Test { public static void main(String[]args) throws Exception { System.out.print(“7.22-7.0=” + (7.22f-7.0f)); } } 我们可能会想当然地认为输出结果应该是 0.22 ,实际结果却是 0.21999979 !
因此,在编程中应尽量避免做浮点数的比较,否则可能会导致一些潜在的问题!除了这些,还应注意浮点数中的一些特殊值,如 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|
+———–+———–+
| 131072.31 | 131072.32 |
+———–+———–+
1 row in set (0.00 sec)
从上面的例子中我们看到c1列的值由131072.32变成了131072.31,这就是浮点数的不精确性造成的。
在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;
它的缺点是会引起精度问题。
Float类型和double类型的区别
FLOAT[(M,D)] [ZEROFILL]
一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有 <24 的一个参数表示一个单精密浮点数字。
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)代表一个双精密浮点数字。

mysql float精度与范围总结相关推荐

  1. mysql float 精度阶段_mysql下float类型使用一些误差详解

    单精度浮点数用4字节(32bit)表示浮点数 采用IEEE754标准的计算机浮点数,在内部是用二进制表示的 如:7.22用32位二进制是表示不下的. 所以就不精确了. mysql中float数据类型的 ...

  2. mysql的float取值范围_mysql float精度与范围总结 - numeric

    ...是ture,不适用范围:不适用于检测可为0的参数. is_numeric();--只适用于检测数字,但假如参数名不存在,会出错,因此不适合于第一层检测. 综合示例: 复制代码 代码如下: FLO ...

  3. mysql float最大值_mysql float精度与范围总结

    FLOAT类型用于表示近似数值数据类型.SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围).MySQL还支持可选的只用于确定存储大小的精度规定.0到23的精度对应FLOA ...

  4. mysql float 转换 int_Mysql 数值类型(int,float,tinyint.......)[转]

    首先说一下mysql的数值类型,MySQL支持所有标准SQL数值数据类型.这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLO ...

  5. mysql float 1,MySql中float类型含义及参数详解

    float表示浮点数,通俗点来说的话,我们可以简单理解为小数 参数有两个: M表示精度,表示浮点数的位数 D表示标度,表示小数位数 M位数不包括小数点位数 举例:float(6,2) 则最大范围表示: ...

  6. 一个MySQL时间戳精度引发的血案

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 阿杜的世界 来源 | 公众号『javaadu』 写在前面 最近工作中遇到两例mys ...

  7. mysql datetime转date_一个MySQL时间戳精度引发的血案

    本文阅读时间大约6分钟. 写在前面 最近工作中遇到两例mysql时间戳相关的问题,一个是mysql-connector-java和msyql的精度不一致导致数据查不到:另一例是应用服务器时区错误导致数 ...

  8. UE4角色Location远距离时动画抖动问题(float精度不够)解决方案

    正题:关于UE4引擎当角色Location超过9999.999后,角色动画更新抖动问题的解决思路. 前提: 1.UE4引擎中距离单位是厘米(cm),也就说我们制作好1.8米的角色在UE4中为180个虚 ...

  9. C# string类型转换为float精度问题

    C# string类型转换为float精度问题 使用float scoValue = float.Parse(scorestr); 的方法,在提交小数的时候会出现精度丢失问题, 如果是0.5则没有问题 ...

最新文章

  1. 高产来自“长期主义”:智源学者朱军谈ICLR 2020 全球发文第二的经验法则
  2. log4j.properties配置总结
  3. 10个奇幻的HTML5和Javascript效果
  4. Android压缩文件(压缩目录)
  5. Android之自定义属性,format详解
  6. 【计算机组成原理】双端口RAM和多模块存储器
  7. 多规则策略如何筛选|视频版
  8. 2016/2/13 《计算机系统要素》(The Elements of Computing Systems)读书笔记(1)
  9. (日常搬砖)python3.7内置调试器PDB
  10. jq实现底部弹框_WPF MVVM 弹框之等待框
  11. Word基础(八)带圈字符
  12. 安全架构--14--企业安全管理体系建设总结
  13. realtek是什么意思_Realtek高清晰音频管理器 全解析
  14. java中语言转换方法_语言切换的三种方法
  15. 研究方法|用CiteSpace进行科学文献可视化分析
  16. SAP中销售订单计划行类别与移动类型关系配置分析
  17. python选择结构练习(一)
  18. js/javaScript通过setTimeout做动画和需要注意的点
  19. 树莓派空气质量检测仪-攀藤G5003ST的连接与使用
  20. vb.net电子时钟实例

热门文章

  1. 快约 - PHP社交约会平台源码开心版
  2. jsp里加java代码,利用静态内部类为您的代码添加辅助功能-JSP教程,Java技巧及代码...
  3. db2数据库还原找不到文件_db2数据库还原
  4. Churchman University简介:
  5. 使用新的 apt 命令在 Ubuntu 16.04 LTS 下管理软件包
  6. Magento批量生成优惠券
  7. 使用 jQuery Mobile 与 HTML5 开发 Web App (二) —— jQuery Mobile 基础
  8. PHP 命令行?是的,您可以!
  9. PHP HTML 生成 PDF
  10. Linux 守护进程的启动方法