mysql的float取值范围_mysqlfloat精度与范围总结-numeric
...是ture,不适⽤范围:不适⽤于检测可为0的参数。 is_numeric();——只适⽤于检测数字,但假如参数名不存在,会出错,因此不适合于第⼀层检测。 综合⽰例: 复制代码 代码如下:
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)。双精度浮点数,对于⽐较⼤的数据同样存在问题!
三、编程中也存在浮点数问题
mysql下载32位不光数据库中存在浮点数问题,编程中也同样存在,甚⾄可以说更值得引起注意!
通过上⾯的介绍,浮点数的误差问题应该⽐较清楚了。如果在程序中做复杂的浮点数运算,误差还会进⼀步放⼤。因此,在程序设计中,如果⽤到浮点数,⼀定要意识到可能产⽣的误差问题。不仅如此,浮点数如果处理不好,还会导致程序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)代表⼀个双精密浮点数字。
...是ture,不适⽤范围:不适⽤于检测可为0的参数。 is_numeric();——只适⽤于检测数字,但假如参数名不存在,会出错,因此不适合于第⼀层检测。 综合⽰例: 复制代码 代码如下:
...if (!$dateTimeString) { $dateTimeString = time(); } $numeric = ''; $add_space = false; for($i=0;$i
本⽂介绍php出现Warning: A non-numeric value encountered问题,⽤实例分析出现这种错误的原因,并提供避免及解决问题的⽅法。<?phperror_reporting (E_ALL);
ini_set('display_errors',
bitsCN
关于mysql数据库的数据类型numeric和decimal decimal(numeric ) 同义,⽤于精确存储数值decimal 数据类型最多可存储 38 个数字,所有数字都能够放到⼩数点的右边。decimal 数据类型存储了⼀个准确(精确)的数...
declare @tmpt table(a int,b numeric(20,3),c numeric(20,3)) insert into @tmpt EXECUTE cbdbfxt 2005,5,'670,' select * from @tmpt drop table #tmpt create
is_numeric:检测是否为数字字符串,可为负数和⼩数 ctype_digit:检测字符串中的字符是否都是数字,负数和⼩数会检测不通过 注意,参数⼀定要是字符串,如果不是字符串,则会返回0/FASLE 下⾯是测试例⼦: ...
...re,不适⽤范围:不适⽤于检测可为0的参数。is_numeric();——只适⽤于检测数字,但假如参数名不存在,会出错,因此不适合于第⼀层检测。 综合⽰例: <?php ini_set("display_errors",1); //ini_set(..
.
...r>echo "0 is null;"; }else{ echo "0 is not null;"; } if(is_numeric($a)){ echo "0 is numeric;"; }else{ echo "0 is not numeric;"; }
if(is_string($a))
...int类型的数字的时候return 1,否则return 0is_numeric:是数字/数字字符串(要是纯的数字字符串,有字符就返回false),return
1example:is_numeric(1234);//
...ts,name,'.$id.',id',
'mobile' => 'required|numeric|min:10|max:10',
'dist_name' => 'req
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论