6

テーブルのデータを変換し、何らかの操作を行う必要があります。

列のデータ型の 1 つが ですが、 10 進Varchar数を格納します。を に変換するのに苦労しています。varchardecimal

私が試してみましたCAST( @TempPercent1 AS DECIMAL(28, 16))

問題は、データに指数表記の値も含まれていることです。たとえば、次のようになります1.61022e-016

そのような値に遭遇すると、SQLクエリはエラーをスローしています。エラーはError converting data type varchar to numeric.

varchar から 10 進数への変換中に指数表記の値を処理するにはどうすればよいですか?

4

3 に答える 3

8

以下を試すことができますが、精度が失われる可能性があります。

select cast(cast('1.61022e-016' AS float) as DECIMAL(28, 16))
于 2013-08-26T20:37:48.773 に答える
5

あなたはただすることができます

CAST(CAST(value AS float) AS decimal(36, 20))

しかし...

これを行うと、float へのキャストは、内部に E を持たないすべての値も変更します - float は machine-epsilon と同じくらい正確にしかできないためです ...

数値に E (+/-) が含まれている場合にのみ float にキャストすることで、これを軽減できます。
通常の 10 進数の場合は、10 進数に直接キャストするだけです。
これにより、浮動小数点の丸め誤差が最小限に抑えられます。

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 式が 10 進数にキャストされる前に最初に暗黙的に float にキャストされることを意味するためです...

于 2017-08-24T14:54:26.633 に答える
1
select convert(Decimal(28,16),convert(float,'1.61022e-016'))
于 2013-08-26T20:39:16.770 に答える