Sql server 将VARCHAR(n)转换为精确浮点
我有一份会计申请。在我的应用程序中,用户可以确定十进制数的个数,因此我不能使用Sql server 将VARCHAR(n)转换为精确浮点,sql-server,type-conversion,accounting,Sql Server,Type Conversion,Accounting,我有一份会计申请。在我的应用程序中,用户可以确定十进制数的个数,因此我不能使用decimal数据类型,因为它具有固定的精度和比例 根据这个话题,, ,永远不要使用float,因为它只是一个近似值。 因此,我使用VARCHAR(n)作为列的数据类型 现在,我想在这个列上使用SUM函数,我想知道列的精确值。我该怎么做?您不能以正常方式对CHAR数据类型进行求和。您需要将它转换成一个数字,然后进行计算 我的建议是去掉十进制< /代码>,如果最终用户可以改变精度和规模的数量,考虑最大可能的可能性,并让S
decimal
数据类型,因为它具有固定的精度和比例
根据这个话题,,
,永远不要使用float,因为它只是一个近似值。
因此,我使用VARCHAR(n)
作为列的数据类型
现在,我想在这个列上使用
SUM
函数,我想知道列的精确值。我该怎么做?您不能以正常方式对CHAR
数据类型进行求和。您需要将它转换成一个数字,然后进行计算
我的建议是去掉<代码>十进制< /代码>,如果最终用户可以改变精度和规模的数量,考虑最大可能的可能性,并让SQLServer使其他位数为0
。CREATE TABLE test(mny DECIMAL(18, 4))
INSERT INTO test VALUES (239428394.87)
SELECT * FROM test
OUTPUT
-----------------
239428394.8700
例如,如果您选择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
数据类型
如果要使用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)
您可以动态获取每个数字的精度和比例,并进行动态查询检查convert方法,您可以执行如下操作:convert(float,yourVarcharColumn),也许这会给你一个开始。如果我转换为float,那么值是否准确?请阅读问题“我希望将VARCHAR转换为float,他希望将float转换为VARCHAR”。你是对的,我添加了错误的URL:你可以使用CLR并加载值以求和到BigRational实现中。(或者自己写。在字符串中求小数并不太难)谢谢你的回答,我知道我不能在字符上求和,但我想对我的查询进行一些转换。你可以
sum(CONVERT(DECIMAL(18,4),value))
但我强烈建议你不要使用字符,但可能比例大于4。我的问题是比例是动态的,用户可以确定比例,现在我不知道该怎么办?将小数点(18,4)设为最大值,谢谢你的想法。我使用实体框架,不考虑动态查询。