簡體   English   中英

SQL Server:將varchar轉換為十進制(還要考慮指數表示法)

[英]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.

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