Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将VARCHAR(n)转换为精确浮点_Sql Server_Type Conversion_Accounting - Fatal编程技术网

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)设为最大值,谢谢你的想法。我使用实体框架,不考虑动态查询。