1不等于1?numeric、decimal、float 和 real 数据类型的区别
大家有没有在SQL中遇见1不等于1(1<>1)的情形!?下面会有一个例子演示这个情形。
先简单介绍一下标题中的四种数值数据类型。
在T-SQL中,numeric和decimal是精确数值数据类型,而float和real是近似数值数据类型。
numeric和decimal是等同的。real等同于float(24).
在定义一个float(n)类型列的时候,如果明确指定了n的值,例如
val float(10)
那么当n的值在1-24之间,系统会将该列(val)标记为real类型;当n的值在25-53之间,系统会将该列标记为float类型。从系统表sys.columns可以得到验证。
如果没有明确指定,n的默认值是53. 补充一下,因为float类型的值是使用科学计数法表示的,所以n表示值的有效位数,MSDN表述n为数值尾数的位数。
现在来看具体的示例。
CREATE TABLE TMAIN(
id INT IDENTITY(1,1) PRIMARY KEY,
val FLOAT
)
GO CREATE TABLE TDETAIL(
id INT IDENTITY(1,1) PRIMARY KEY,
pid INT,
val FLOAT
)
GO INSERT INTO TMAIN VALUES(100);
INSERT INTO TMAIN VALUES(100); INSERT INTO TDETAIL VALUES(1, 30);
INSERT INTO TDETAIL VALUES(1, 35);
INSERT INTO TDETAIL VALUES(1, 35); INSERT INTO TDETAIL VALUES(2, 30);
INSERT INTO TDETAIL VALUES(2, 30);
INSERT INTO TDETAIL VALUES(2, 40); --SELECT * FROM TMAIN;
--SELECT * FROM TDETAIL; SELECT TM.id, SUM(TM.val * TD.val) / 10000.0 AS SUMPER
FROM TMAIN TM INNER JOIN TDETAIL TD ON TM.id = TD.pid
GROUP BY TM.id SELECT TM.id, SUM(TM.val * TD.val) / 10000.0 AS SUMPER
FROM TMAIN TM INNER JOIN TDETAIL TD ON TM.id = TD.pid
GROUP BY TM.id SELECT *
FROM (
SELECT TM.id, SUM(TM.val * TD.val / 10000.0) AS SUMPER
FROM TMAIN TM INNER JOIN TDETAIL TD ON TM.id = TD.pid
GROUP BY TM.id
) TMS
WHERE TMS.SUMPER = 1; SELECT *
FROM (
SELECT TM.id, SUM(TM.val * TD.val) / 10000.0 AS SUMPER
FROM TMAIN TM INNER JOIN TDETAIL TD ON TM.id = TD.pid
GROUP BY TM.id
) TMS
WHERE TMS.SUMPER = 1; DROP TABLE TMAIN;
DROP TABLE TDETAIL;
没执行之前,要不要预测一下结果?
先看一下前二个SELECT语句的执行结果。
第一个SELECT
| id | SUMPER |
| 1 | 1 |
| 2 | 1 |
第二个SELECT
| id | SUMPER |
| 1 | 1 |
| 2 | 1 |
结果是一样的,至少,看上去一样的!
再看一下后两个SELECT语句的执行结果。
第三个SELECT
| id | SUMPER |
| 2 | 1 |
第四个SELECT
| id | SUMPER |
| 1 | 1 |
| 2 | 1 |
后两个SELECT的结果产生了差异:一个是先乘除,后加减;另一个是先加减,后乘除。
因为val列是float类型,是近似数值数据类型,所以很明显,第一个SELECT的结果中有一行数据在计算过程中产生了近似值1. 而WHERE语句中指定的1,默认是int类型,int类型是精确数据类型。所以第三个SELECT语句出现了1<>1的情形。
举例完毕。
如果将val列定义成decimal类型,上面四个SELECT语句的结果是一样的。建议谨慎使用近似数值数据类型,并且在计算和比较值的时候,预见潜在的问题。
1不等于1?numeric、decimal、float 和 real 数据类型的区别的更多相关文章
- SqlServer中decimal(numeric )、float 和 real 数据类型的区别[转]
decimal(numeric ) 同义,用于精确存储数值 float 和 real 不能精确存储数值 decimal 数据类型最 ...
- float与position间的区别
float与position间的区别: 个人理解为:脱离文档流不一定脱离文本流:但脱离文本流,则也脱离文档流.[如有更好的理解还望评论区一起探讨,共同学习进步]一.float 浮动(脱离文档流, ...
- Sql的decimal、float、double类型的区别
三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E ...
- sql decimal & float & celling 介绍
decimal 可以用在指定几个位数比如 123.456, decimal(3,3), 用这类型计算比较准确. 默认情况下,将数字转换为较低精度和小数位数的 decimal 或 numeric 值时, ...
- MySQL中 DECIMAL FLOAT DOUBLE的区别
第一篇文章: MySQL中Decimal类型和Float Double等区别 MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,d ...
- 数据库类型空间效率探索(五)- decimal/float/double/varchar
以下测试为userinfo增加一列,列类型分别为decimal.float.double.varchar.由于innodb不支持optimize,所以每次测试,都会删除表test.userinfo,重 ...
- position:absolute、float、display:inline-block 区别
position: absolute会导致元素脱离文档流,被定位的元素等于在文档中不占据任何位置,在另一个层呈现,可以设置z-index.PS的图层效果就是position: absolute. fl ...
- float和double数据类型的声明,转换和计算
声明时,只要有小数部分float必须加F/f,而double却不用 //float的声明只要有小数部分就要加F,不然会报不能隐式的将double类型转换为float类型. float f1 = 1;/ ...
- 一天搞定CSS: 浮动(float)与inline-block的区别--11
浮动: 使元素脱离文档流,按照指定的方向发生移动,遇到父级的边界或者相邻的浮动元素就会停下来. inline-block: inline-block是指行内块元素,它具有行内元素和块元素两者的特点,可 ...
随机推荐
- Tomcat编码配置解疑
环境:tomcat6.0.23 jdk 1.6 相关参考: http://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html http://wiki.ap ...
- java 枚举类型 构造函数及用法
// 1. 定义枚举类型 public enum Light { // 利用构造函数传参 RED (1), GREEN (3), YELLOW (2); // 定义私有变量 private int n ...
- Validform使用ajax详解
demo.config({ showAllError:true, url:"这里指定提交地址", ajaxpost:{ //可以传入$.ajax() ...
- 给linux安全模块LSM添加可链式调用模块(一)
前些日子接了个外包的活,了解了一下Linux安全模块,发现了安全模块中的一些问题. 关于linux安全模块LSM在此就不多说了,大家google下就明白了. 这里主要介绍的是如何修改这个模块,使它可链 ...
- java JSONObject/JSONArray详解
应用架包:json-lib-2.4-jdk15.jar.及相关依赖架包. 一.JSONObject和JSONArray对象 -------------------------------------- ...
- Android之Viewpager+Fragment实现懒加载
我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用.而ViewPager默认会缓存三页数据,即:Viewpager每加载一个Fra ...
- css3实现酷炫的3D盒子翻转效果
简介 运用css3先在平面空间组成立方体盒子,再让整个盒子翻转起来,先来张效果图: 步骤 1.先用css将6张图片摆成下图的样子: 下面就是通过css3的3D变换将每个面进行翻转,使之成为一个立体的盒 ...
- ibm v3700
raid5总容量计算(n-1)*最小盘容量RAID0:N块盘组成,逻辑容量为N块盘容量之和:RAID1:两块盘组成,逻辑容量为一块盘容量:RAID3:N+1块盘组成,逻辑容量为N块盘容量之和:RAID ...
- Eclipse中将Java项目转换成Web项目的方法
前言: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个java工程,将无法在Tomcat中进行部署运行. 方法: 1.找到.project文件,找到里面的<n ...
- EAN
public static string EAN13(string s) { ;//输入的校验码 if (!Regex.IsMatch(s, @"^\d{12}$")) { if ...