2010-05-30 92 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中,數字在功能上等同於小數數據類型。