2013-03-01 38 views
1

我試圖從TADOQuery包裝對象執行下面的SQL查詢時,得到的問題:SQL Server Express的精度

SELECT * 
FROM obj 
WHERE ObjectType = 'user' 
    AND ((((valueOne > 6.13661152336E-318) and (valueTwo < 1.68611310981) 

的問題顯然是ValueOne太小,因此不能正常64位機器精度內表示。問題是我從一個文件中讀取這些值,並且我無法控制我得到的輸入數據。我會實施一個四捨五入程序來處理這個問題,但我不確定SQL Server 2012 Express中最小(以絕對值)表示的數字。

誰能幫我對此事

回答

2

Decimal and numeric

固定精度和比例的數字。當使用最大精度,有效值從 - 10^38 1到10^38 - 1

float and real

浮動範圍:- 1.79E + 308 -2.23 E-308,在0和2.23E-308至1.79E + 308
實數範圍:- 3.40E + 38 -1.18E - 38,0和1.18E - 38至3.40E + 38

int, bigint, smallint, and tinyint

BIGINT範圍:-2^63(-9,223,372,036,854,775,808)至2^63-1(9,223,372,036,854,775,807)
INT範圍:-2^31(2,147,483,648)至2^31 -1(2,147,483,647)
SMALLINT範圍:-2^15(-32,768)至2^15-1(32,767)
TINYINT範圍:0到255

6.13661152336E-318不在SQL Server中可表示爲本機SQL Server支持類型的範圍之外。您可以嘗試使用CLR User defined type。您需要一個自定義CLR庫來操縱這些極端值。

+0

謝謝你!那麼,在SQL服務器的精度範圍內截斷我的ValueOne的最佳方法是什麼? – kenny 2013-03-01 13:45:32

+0

在客戶端截斷它。您需要一個庫來解析該值並將其轉換爲SQL Server支持的範圍內的值。這不是一個簡單的'圓',因爲你沒有價值。這個問題比你想象的要複雜得多。有關替代方案的討論,請參閱http://stackoverflow.com/questions/1387430/recommended-math-library-for-c-net的答案。 – 2013-03-01 13:48:04

+0

再次感謝您的幫助。我做了類似 round(valueOne * power(10,10))/ power(10,10); 這對我很有用,因爲我不需要比小數點後10位更大的精度。 – kenny 2013-03-01 15:15:15