【问题标题】:SQL Server float datatypeSQL Server 浮点数据类型
【发布时间】:2010-05-30 12:07:13
【问题描述】:

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";
 }
}

【问题讨论】:

    标签: sql-server floating-point


    【解决方案1】:

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

    【讨论】:

    • +1 我认为您关于四舍五入策略的第一点很可能是物有所值。根据msdn.microsoft.com/en-us/library/ms187912.aspx“IEEE 754 规范提供了四种舍入模式:舍入到最接近、向上舍入、向下舍入和舍入到零。Microsoft SQL Server 使用向上舍入。”。
    【解决方案2】:

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

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

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

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

    IEEE 754 规范提供了四种舍入模式:四舍五入、向上舍入、向下舍入和舍入为零。 Microsoft SQL Server 使用四舍五入。

    关于十进制和数字

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2017-03-23
      • 2017-03-15
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多