将 VARCHAR(n) 转换为精确的 FLOAT

Convert a VARCHAR(n) to exact FLOAT

我有一份会计申请。在我的应用程序中,用户可以确定小数位数,所以我不能使用 decimal 数据类型,因为它具有固定的精度和小数位数。

根据这个话题, Use Float or Decimal for Accounting Application Dollar Amount?,永远不要使用浮点数,因为它只是一个近似值。 所以我使用 VARCHAR(n) 作为我列的数据类型。

现在,我想在此列上使用 SUM 函数,并且我想要列的确切值。我该怎么做?

您不能以正常方式对 CHAR 数据类型求和。你需要CONVERT它到一个数字,然后做计算。

我的建议是选择 DECIMAL 并且如果最终用户可以更改精度和小数位数,请考虑您可以拥有的最大值并让 SQL 服务器将其他数字设为0

例如,如果您选择 DECIMAL(19, 4) 并且最终用户选择只有 2 个比例,SQL 服务器将其他两位数设为 0

CREATE TABLE test(mny DECIMAL(18, 4))
INSERT INTO test VALUES (239428394.87)

SELECT * FROM test


OUTPUT
-----------------
239428394.8700

您还可以选择使用 MONEY 数据类型。

Comparing MONEY and DECIMAL

如果你想使用 CHAR,试试这个:

DECLARE @precision INT
        ,@scale INT
        ,@output VARCHAR(1000)
        ,@input CHAR(10) = '234234.453'

SELECT  @precision = LEN(LEFT(@input, CHARINDEX('.', @input) - 1)) + LEN(SUBSTRING(@input,CHARINDEX('.', @input) + 1, LEN(@input)))
        ,@scale = LEN(SUBSTRING(@input, CHARINDEX('.', @input) + 1, LEN(@input)))

SELECT @Output = 'SELECT SUM(CONVERT(DECIMAL(' + CONVERT(VARCHAR(100), @precision) + ', ' + CONVERT(VARCHAR(100), @scale) + '), ' + CONVERT(VARCHAR(100), @input) + '))'
SELECT @Output
EXEC (@Output)

您可以动态获取每个数字的精度和小数位数并进行动态查询