2010-05-30 60 views
3

SQL Server Float文档说SQL Server的float数据类型

近似数数据类型使用 与浮点数字数据。 浮点数据是近似值;因此,并非数据 类型范围中的所有值都可以精确地表示。

这是我期望它说的。如果是这样,虽然为什么在SQL Server中的以下返回“是”(意外)的情况下

DECLARE @D float 
DECLARE @E float 

set @D = 0.1 
set @E = 0.5 

IF ((@D + @D + @D + @D [email protected]) = @E) 
BEGIN 
PRINT 'YES' 
END 
ELSE 
BEGIN 
PRINT 'NO' 
END 

但等价的C++程序返回“否”(预计为0.1不能精确表示,但0.5可以)

#include <iostream> 

using namespace std; 

int main() 
{ 
float d = 0.1F; 
float e = 0.5F; 

if((d+d+d+d+d) == e) 
{ 
cout << "Yes"; 
} 
else 
{ 
cout << "No"; 
} 
} 

回答

8

这可能是由不同的舍入策略,操作数的应用顺序,中间结果的存储方式等等引起的。有关详细信息,请参见What Every Computer Scientist Should Know About Floating-Point Arithmetic。如果你不确定你是否知道你在做什么,你应该避免在浮点数计算中进行等式比较。

+0

+1我认为你对舍入策略的第一点很可能是钱的问题。根据http://msdn.microsoft.com/en-us/library/ms187912.aspx“IEEE 754规范提供了四种取整模式:四舍五入到最近,四舍五入,四舍五入为零。Microsoft SQL Server使用围捕。”。 – 2010-05-30 12:52:54

0

而不是增加新的答案,我想使用浮动或real列从technet.microsoft.com - Using decimal, float, and real Data

避免增加一些报价WHERE子句搜索条件,特别是=和<>运营商。最好将float和real列限制为>或<比较。

而且,你也知道,我们的目的是描述如下:

float和real数据类型被称为近似数据类型。 float和real的行为遵循关于近似数值数据类型的IEEE 754规范。

IEEE 754规范提供了四种舍入模式:舍入到最近,舍入,舍入和舍入为零。 Microsoft SQL Server使用四舍五入。

关于十进制与数字

使用十进制数据类型来存储带有小数的数字时指定的数据值必须准确存储。 在Transact-SQL中,数字在功能上等同于小数数据类型。