6

我需要转换表格的数据并进行一些操作。

列数据类型之一是Varchar,但它存储十进制数。我正在努力将其转换varchardecimal.

我努力了CAST( @TempPercent1 AS DECIMAL(28, 16))

问题是数据也有一些指数符号的值,例如:1.61022e-016.

遇到此类值时,sql 查询会引发错误。错误是Error converting data type varchar to numeric.

在 varchar 到十进制转换期间,我应该如何处理指数符号值?

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))

但...

如果你这样做,cast-to-float 也将改变所有没有 E 内部的值 - 因为浮点数只能与 machine-epsilon 一样精确......

您可以通过仅在数字包含 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 表达式在被转换为十进制之前首先被隐式转换为浮点数......

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