SQL Server浮点数据类型

时间:2010-05-30 12:07:14

标签: sql-server floating-point

SQL Server Float的文档说

  

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

这就是我所期望的。如果是这种情况,为什么以下在SQL Server中返回“是”(意外)

DECLARE @D float
DECLARE @E float

set @D = 0.1
set @E = 0.5

IF ((@D + @D + @D + @D +@D) = @E)
 BEGIN
 PRINT 'YES'
 END 
ELSE
 BEGIN
 PRINT 'NO'
 END 

但等效的C ++程序返回“No”(预期为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";
 }
}

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

我想添加technet.microsoft.com - Using decimal, float, and real Data

中的一些引号,而不是添加新的答案
  

避免在WHERE子句搜索条件中使用float或real列,尤其是=和&lt;&gt;运营商。最好将浮点数和实数列限制为&gt;或者&lt;比较。

另外,如您所知,目的如下:

  

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

     

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

关于小数和数字

  

当必须严格按照指定存储数据值时,使用十进制数据类型存储带小数的数字。   在Transact-SQL中,numeric在功能上等效于十进制数据类型。