2015-03-13 71 views
-1

我在執行此插入問題:SQL Server 2008中插入與選擇怪異的數字行爲

INSERT INTO tblCoord (coordName, col1, col2, col3) 
SELECT T1.NAME, 
     T2.COL1, 
     T2.COL2, 
     T2.COL3 
FROM table1 as T1 
    INNER JOIN GD_DB.dbo.someview as T2 
     ON T2.HOLEID = T1.NAME 

現在,我的問題是,COL1,COL2和COL3從tblCoord是數字(28,16)和t2中的col1,col2,col3是浮點數。

當插件是由,14959.95成爲14959.9500000000010000

怎麼來的,這個問題能解決,以保持14959.9500000000000000?從其他數據庫

*即時閱讀同一實例

**編輯:固定做ROUND(CAST(T2.[colX] as numeric(28,16)),4)保持的4

+2

不要混合數據類型... – jarlh 2015-03-13 12:44:59

+0

好吧,我可以」 t決定數據類型,我從應用程序數據庫轉移到anot她的應用數據庫。我無法控制他們的節目來自其他公司。我的工作只是傳輸數據並處理這類問題:( – JonD 2015-03-13 12:47:12

+0

)你有一個問題,因爲浮點數並不是完全存儲這些值,而是使用數值,例如,這就是爲什麼貨幣值總是應該存儲爲「decimal」或'數字' – 2015-03-13 12:53:17

回答

0

精密按照戈登·利諾夫的評論這是因爲浮動不是精確值。我能想到的來解決這個問題最好的辦法就是首先存儲爲數字(28,16)

INSERT INTO tblCoord (coordName, col1, col2, col3) 
SELECT T1.NAME, 
     Cast(T2.COL1 as numeric(28,2)), 
     Cast(T2.COL2 as numeric(28,2)), 
     Cast(T2.COL3 as numeric(28,2)) 
FROM table1 as T1 
    INNER JOIN GD_DB.dbo.someview as T2 
     ON T2.HOLEID = T1.NAM 
1

我不明白的問題,也沒有公認的答案之前,強制轉換爲數字(28,2)
浮動是正確的
鑄造流回至數字是當你看到其中的差別
浮動不準確,數字是

declare @flt float = cast(14959.95 as numeric(28,16)) 
select @flt       -- 14959.95 
select cast(@flt as numeric(28,16)) -- 14959.9500000000030000 
select cast(@flt as numeric(28,2)) -- 14959.95 
select ROUND(cast(@flt2 as numeric(28,16)),4) -- 14959.9500000000000000 fixes the output but does not really fix the data 



declare @flt2 float = cast(14959.95 as numeric(28,2)) 
select @flt2       -- 14959.95 
select cast(@flt2 as numeric(28,16)) -- 14959.9500000000010000 
select cast(@flt2 as numeric(28,2)) -- 14959.95 
+0

Woops,我誤讀了響應,但得到了啓發,我做了 ROUND(CAST(T2。[col1 ]作爲數字(28,16)),4) 給了我很好的值與0填充後來 – JonD 2015-03-13 14:09:12