代码之家  ›  专栏  ›  技术社区  ›  Martin Smith

SQL Server浮点数据类型

  •  3
  • Martin Smith  · 技术社区  · 14 年前

    文件 SQL Server Float

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

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

    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++程序返回“否”(预期为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 回复  |  直到 10 年前
        1
  •  8
  •   Malte Clasen    14 年前

    这可能是由于不同的舍入策略、操作数的应用顺序、中间结果的存储方式以及其他原因造成的。见 What Every Computer Scientist Should Know About Floating-Point Arithmetic 详情。如果您不确定自己是否知道自己在做什么,则应避免在浮点数计算中进行相等比较。

        2
  •  0
  •   LCJ    10 年前

    我不想添加新的答案,而是希望添加来自 technet.microsoft.com - Using decimal, float, and real Data

    避免在WHERE子句搜索条件中使用浮点或实列,尤其是=和<gt;运算符。最好将浮动列和实列限制为>或<比较。

    此外,如您所知,其意图如下所述:

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

    IEEE754规范提供四种舍入模式:四舍五入到最近、四舍五入、四舍五入到零。Microsoft SQL Server使用舍入。

    关于十进制和数字

    当数据值必须完全按照指定的方式存储时,使用decimal数据类型存储带小数的数字。 在Transact-SQL中,numeric在功能上等同于decimal数据类型。