2013-12-13 63 views
0

我有一個表算術溢出錯誤數值數據類型轉換爲數字

SIZE NUMERIC(14,5)  
PRICE NUMERIC(14,5)  

當我執行此select查詢下列,

SELECT SIZE, 
PRICE, 
SIZE*PRICE AS TOTAL 
FROM TNAME 

我得到的結果:

1.00000 90.00000 90.0000000000 
1.00000 90.00000 90.0000000000 
1.00000 90.00000 90.0000000000 
1.00000 100.00000 100.0000000000 
1.00000 30.00000 30.0000000000 

我想知道爲什麼第三列返回小數點後10位數字?

而且我越來越

算術溢出錯誤數值數據類型轉換爲數字

同時插入結果成具有相同的數據類型相同的列的另一個表

INSERT INTO TNAME2(SIZE, PRICE, TOTAL) 
    SELECT 
     SIZE, PRICE, SIZE * PRICE AS TOTAL 
    FROM 
     TNAME 
+2

_I'm想知道爲什麼第三列返回小數點後10位?_那麼它應該是什麼? –

+0

兩個因素的乘積在邏輯上會導致更高的精度。如果你四捨五入,你可能會失去信息。 –

回答

1

嘗試這個。

SELECT SIZE, 
PRICE, 
CAST(SIZE*PRICE AS numeric(14,5))AS TOTAL 
FROM TNAME 
+0

已嘗試此操作...仍存在錯誤 – user3085995

+0

插入檢查表TNAME2和TName的表定義時沒有錯誤。 – Snehal

+0

@Snehal:請檢查我的編輯內容......第三列在'TNAME'中不可用這是一個計算列,其值要插入到'TNAME2'表的列'TOTAL NUMERIC(15,5)' – user3085995

0

下面有用的鏈接。 Multiplication of numerics 按照這個鏈接,你可以嘗試作爲查詢如下

SELECT SIZE, 
PRICE, 
CAST(SIZE*PRICE AS numeric(28,5))AS TOTAL 
FROM TNAME 
0

試試這個

SELECT SIZE,PRICE,CONVERT(numeric(14,5), SIZE*PRICE) AS TOTAL 
FROM TNAME 

寫插入相同的查詢時,必須編制

1
INSERT INTO TNAME2 
SELECT SIZE , 
Price , 
CAST(SIZE * PRICE AS NUMERIC(15, 5)) 
FROM  TNAME 

OR

INSERT INTO TNAME2 (SIZE,Price,TOTAL) 
SELECT SIZE , 
Price , 
CAST(SIZE * PRICE AS NUMERIC(15, 5)) AS TOTAL 
FROM  TNAME 
1

關於第一個問題,小數的位數沒有什麼不對。這是我們在學校學習的基本日常乘法:將兩個十進制數相乘產生一個具有與操作數的小數位數之和一樣多的十進制數的數字。整數位數可以達到操作數整數位數的總和。

乘以10.11通過12.13產生122.6343。如果SQL Server破壞了這個基本規則並任意截斷了結果,那將是非常尷尬的。

因此,當您嘗試將產品存儲在接受更少數字的列中時,會出現溢出錯誤。 SQL Server不會自動更改位數,因爲無法決定正確的操作。

有一個lot of ways就可以解決這個問題,取決於精度損失你願意忍受:

  • 截斷多餘的數字,也就是把它們扔掉,接受了一個單位的損失。如果您存儲總計,這可能會成爲很多錢。
  • 舍入所需的位數。聽起來很直觀,但中途價值呢,例如0.00005在你的情況?它應該是0.0001還是0.0000?因此,我們有
  • 四捨五入,其中0.5變爲1,導致每個條目
  • 下,當它變​​成0了.5損失,同樣損失
  • 回合偶數或奇數,在那裏你輪最近的奇數或偶數,平均產生最小的損失。雖然這聽起來很奇怪,但其是IEEE 754中定義的標準。它也被稱爲banker's rounding,因爲它用於簿記以最小化由於截斷導致的損失。

如果你想存儲更少的數字,你需要決定是否需要截斷額外的數字或如何四捨五入數字,然後在代碼中自己做。

對於您的情況,您可以使用CAST來獲得所需精度的數字。這將執行四捨五入半升,其中0.00005變得0.0001,如:

INSERT INTO TNAME2(SIZE, PRICE, TOTAL) 
SELECT 
    SIZE, PRICE, CAST(SIZE * PRICE as numeric(14,5)) AS TOTAL 
FROM 
    TNAME 

SQLFiddle here

這將工作,假設位數不超過14個,否則你將不得不更改類型你的表字段。

如果你想在SQL中進行其他類型的舍入,你將不得不創建你自己的函數。

相關問題