mysql float精度与范围总结

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)代表一个双精密浮点数字。


http://www.hulian.top/zixun/post/5226.html

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MySQL中的float和double都是浮点数类型,用于存储小数。float类型占用4个字节,double类型占用8个字节。float类型的精度为单精度,即有效数字为7位,double类型的精度为双精度,即有效数字为15位。因此,double类型的精度float类型更高。在存储小数时,如果需要更高的精度,建议使用double类型。 ### 回答2: MySQLfloat和double是两种数值型数据类型,用来存储带有小数部分的数字。它们的差别在于所占用的存储空间以及精度的不同。 float数据类型可以存储一个单精度浮点数,占用4个字节的存储空间。它的精度大约是7位小数,也就是说,如果使用float来存储一个数值型数据,显示出来的小数部分最多只有7位数字是精确的。如果超过这个位数,就会出现舍入误差。 double数据类型则可以存储一个双精度浮点数,占用8个字节的存储空间。它的精度大约是15位小数,也就是说,使用double来存储一个数值型数据,显示出来的小数部分最多只有15位数字是精确的。与float相比,double的精度更高,可以避免更多的舍入误差。 需要注意的是,在MySQL中,float和double类型的数据存储方式是采用IEEE 754标准来进行存储的。这个标准规定了浮点数的存储结构,即数值的二进制表示、小数点位置、指数大小等等。因此,在使用float和double类型时,需要遵循这个标准来进行数据的处理,以避免数据的不正确处理。 总之,在选择float还是double类型时,需要根据具体的需求来确定。如果数据的精度要求不是很高,可以使用float类型来进行存储。而如果需要更高精度的数据计算,则应该使用double类型来进行存储。在实际的开发过程中,也可以根据数据的具体情况进行试验和优化,以获得更加精确的数据计算结果。 ### 回答3: 在MySQL中,float和double都是数值型数据类型,用于存储浮点数,但是它们之间存在着一些区别。 float是单精度浮点数,占用4个字节,能够存储大约7位小数,可以表示的数值范围是-3.4E38到3.4E38。在使用float类型时应该注意,由于精度有限,可能会出现舍入误差,因此不建议对其用于需要高精度计算的场景。 double是双精度浮点数,占用8个字节,能够存储大约15位小数,可以表示的数值范围是-1.7E308到1.7E308,它的精度float更高,因此更适用于需要高精度计算的场景。 当我们需要更高的精度时,可以考虑使用decimal数据类型。decimal是一种高精度的定点数,可以存储比float和double更多的有效数字。它的存储空间和精度取决于所定义的长度和精度,但是它相较于float和double存储量更大,在处理一些需要大数值范围和高精度的计算时,decimal比double更可靠,即使在高精度的计算中它也可以保持精度不变。 在使用浮点数时需要注意避免计算误差,尤其在需要进行高精度计算时更为明显。为了保证计算的正确性,我们可以采用其他的方法来保证浮点数的计算精度,例如,分离整数部分和小数部分,使用整数进行计算,最后将结果转换成浮点数,或者使用一些高精度计算的库函数进行计算等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值