2015-03-13 53 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