将VARCHAR(n)转换为精确FLOAT

时间:2015-03-30 05:43:17

标签: sql-server type-conversion accounting

我有一个会计应用程序。在我的应用程序中,用户可以确定十进制数的数量,因此我不能使用decimal数据类型,因为它具有固定的精度和比例。

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

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

1 个答案:

答案 0 :(得分:1)

您无法以正常方式对CHAR数据类型求和。您需要CONVERT它到一个数字,然后进行计算。

我的建议是转到DECIMAL,如果最终用户可以更改精度和比例,请考虑您可以拥有的最大值,并让SQL Server将其他数字设为0

例如,如果您选择DECIMAL(19, 4)并且最终用户选择只有2个比例,则SQL Server将其他两个数字设为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)

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