簡體   English   中英

在SQL Server中將varchar轉換為數值類型的算術溢出錯誤

[英]Arithmetic overflow error converting varchar to data type numeric in SQL Server

嘗試進行此轉換時,出現“算術溢出”錯誤:

select convert(numeric(10, 4), '4236575.320000000000000000')

但是可以使用以下命令將其轉換為不帶小數的數字:

select convert(numeric, '4236575.320000000000000000')

這是什么原因呢?

4236575.320000000000000000要求數據類型為NUMERIC(25, 18) 4236575.320000000000000000 NUMERIC(25, 18)因為小數點前有7位數字,小數點后有18位。

話雖如此,只要可以存儲小數點前的部分而不會被截斷,則可以使用較小的精度和小數位數:

SELECT str
     , CONVERT(NUMERIC(8, 1), str) AS [ddddddd.d]
     , CONVERT(NUMERIC(7, 0), str) AS [ddddddd]
     , CONVERT(NUMERIC(9, 2), str) AS [ddddddd.dd]
FROM (VALUES
    ('4236575.320000000000000000')
) AS tests(str)

結果:

str                        | ddddddd.d | ddddddd | ddddddd.dd
4236575.320000000000000000 | 4236575.3 | 4236575 | 4236575.32

當您指定numeric(10,4)您將告訴SQL Server使用精度10,即從小數點兩側存儲的位數,以及小數位數為4(即小數點右邊的4位)。

這實際上意味着最大數量可以是999999.9999(小數點左邊的6位數字,右邊的4位數字)小於4236575.3280,這會使存儲空間溢出。 重要的是,將丟失的數據是最高有效位數,而不是最低有效位數,這就是為什么它會失敗。

您會注意到以下所有成功:

select convert(numeric(11, 4), '4236575.320000000000000000')
select convert(numeric(10, 3), '4236575.320000000000000000')
select convert(numeric(8, 1), '4236575.320000000000000000')

所有這些都允許小數點左邊的7位數字。

您可以將round()轉換為floatmoney

select round(cast('4236575.328000000000000000' as money), 2)

輸出量

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM