![](/img/trans.png)
[英]Transform/Convert Scientific Notation [From Varchar to Decimal/Numeric] in SQL
[英]SQL Server: Convert varchar to decimal (with considering exponential notation as well)
我需要轉換表的數據並進行一些操作。
列數據類型之一是Varchar
,但它存儲十進制數。 我正在努力將varchar
轉換為decimal
。
我已經嘗試過CAST( @TempPercent1 AS DECIMAL(28, 16))
問題在於數據也具有某些指數形式的值,例如: 1.61022e-016
。
sql查詢遇到此值時將引發錯誤。 錯誤是Error converting data type varchar to numeric.
在varchar到十進制轉換期間,如何處理指數符號值?
您可以嘗試遵循,但可能會降低准確性:
select cast(cast('1.61022e-016' AS float) as DECIMAL(28, 16))
你可以做
CAST(CAST(value AS float) AS decimal(36, 20))
但...
如果這樣做,則強制轉換為浮點數還將更改內部沒有E的所有值-因為浮點數只能與機器ε一樣精確...
您可以通過僅在數字包含E(+/-)時將其強制轉換為浮點來緩解這種情況。
如果是正常的十進制數字,則直接將其強制轉換為十進制。
這將最小化浮點舍入誤差。
SELECT
CASE
WHEN factor LIKE '%E-%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20))
WHEN factor LIKE '%E+%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20))
ELSE CAST(factor AS DECIMAL(36, 20))
END AS factor
FROM T_IFC_Import_Currency
或更緊湊:
SELECT
CASE
WHEN factor LIKE '%E[+-]%' THEN CAST(CAST(factor AS FLOAT) AS DECIMAL(36, 20))
ELSE CAST(factor AS DECIMAL(36, 20))
END AS factor
FROM T_IFC_Import_Currency
注意:
不要簡化為:
SELECT
CAST
(
CASE
WHEN factor LIKE '%E[+-]%' THEN CAST(factor AS FLOAT)
ELSE factor
END
AS decimal(36,20)
) AS factor
FROM T_IFC_Import_Currency
因為這意味着case表達式在被轉換為十進制之前首先隱式轉換為float。
select convert(Decimal(28,16),convert(float,'1.61022e-016'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.