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)代表一个双精密浮点数字 (编辑:常州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |