2012-04-26 53 views
4

我正在規範化數據庫的過程中,其中一部分涉及將一個表中的列從FLOAT轉換爲DECIMAL(28,18)。當我然後嘗試將此轉換後的列連接回源列時,它在某些情況下不會返回結果。MS SQL浮點十進制比較問題

這似乎蜜蜂是與它的轉換方式。例如,FLOAT轉換爲DECIMAL(28,18)生產:

51.051643260000006000 

原始FLOAT

51.05164326 

我試圖修改FLOAT的各種方式,並且沒有這些工作的任一:

CAST(51.05164326 AS DECIMAL(28,18)) = 51.051643260000000000 
STR(51.05164326 , 28,18) = 51.0516432599999990 

的原因轉換是由於改善這些字段的準確度。

有沒有人得到了一致的策略,這些數字轉換,並能夠確保後續工作的加盟?

在此先感謝

CM

+0

浮點數字是不準確的數字,但近似值。轉換爲字符串通常將其舍入,以便它看起來像一個確切的數字,而確切的表示形式實際上是不同的。你不應該嘗試加入花車。 – Lucero 2012-04-26 08:54:29

+0

不幸的是我沒有很多選擇。你能推薦一種方法來解決這個問題嗎? – CatchingMonkey 2012-04-26 09:04:55

+0

我會嘗試轉換/將其轉換爲'decimal',然後使用['ROUND()']將其舍入到14位數字(http://msdn.microsoft.com/zh-cn/library/ms175003.aspx )。 – Lucero 2012-04-26 09:44:17

回答

5

對於您的應用程序,你需要考慮你有多少小數需要。它看起來像在現實中你需要大約8-14位小數不18.

一種方式做轉換爲cast(cast(floatColumn as decimal(28,14)) as decimal(28,18))

做一個小數之間的聯接浮欄,你可以做這樣的事情:

ON cast(cast(floatColumn as decimal(28,14)) as decimal(28,18)) = decimalColumn 

配備了雙播是相同雙投用於創建decimalColumn,這將允許您使用decimalColumn上的索引。

另外,您可以使用一系列聯接:

ON floatColumn > decimalColumn - @epsilon AND floatColumn < decimalColumn + @epsilon 

這仍然應該利用指數的上decimalColumn

然而,這是不尋常的加入對小數。除非你確實需要加入他們還是需要做一個直接的平等的比較(而不是一個範圍比較),它可能是更好的只是做轉換,你是和記錄的事實,有一個小的損失由於最初選擇不適當的數據類型而導致的準確性。

欲瞭解更多信息,請參閱:

+0

對於遲到的迴應,我們花了一段時間纔開始測試。但這個答案確實有用!謝謝! – CatchingMonkey 2012-05-14 11:47:52