Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
C# SQL正在对我的小数进行四舍五入_C#_Sql_Sql Server_Decimal_Converter - Fatal编程技术网

C# SQL正在对我的小数进行四舍五入

C# SQL正在对我的小数进行四舍五入,c#,sql,sql-server,decimal,converter,C#,Sql,Sql Server,Decimal,Converter,我正在使用SQLServer2005。数据类型为varchar。我想把数字转换成 1250000 到 在SQL查询中,删除尾随的零。我尝试了很多事情,但都没有成功——遇到了“修剪不是功能”等问题 这是我目前拥有的,在我尝试的每个迭代中 select top 30 var1, var2, var3, var4, CONVERT(DECIMAL(6,2), (var5 / 1000000)) as 'Number' from databasetable where

我正在使用SQLServer2005。数据类型为varchar。我想把数字转换成

1250000

在SQL查询中,删除尾随的零。我尝试了很多事情,但都没有成功——遇到了“修剪不是功能”等问题

这是我目前拥有的,在我尝试的每个迭代中

select top 30 
    var1, var2, var3, var4, 
    CONVERT(DECIMAL(6,2), (var5 / 1000000)) as 'Number' 
from 
    databasetable 
where 
    var1 = x 

select top 30 
    var1, var2, var3, var4, 
    cast((var5 / 1000000) as decimal(6,2)) as 'Number' 
from 
    databasetable 
where 
    var1 = x 

以上两个查询均四舍五入至最接近的百万,即1250000变为1.00,等等。如有任何想法,将不胜感激。将decimal更改为numeric也没有帮助。

如果不知道您是确切的平台,我不能肯定,但我猜它会将其截断为int。在进行计算之前,我会尝试将var5和10000000进行转换。差不多

// NOTE, I have not tried this code
CONVERT(DECIMAL(6,2), (CONVERT(DECIMAL(6,2), var5) / CONVERT(DECIMAL(6,2), 1000000)))

在不知道你是确切的平台的情况下,我不能肯定,但我猜它会被截断为一个int。在做数学之前,我会尝试转换var5和10000000。差不多

// NOTE, I have not tried this code
CONVERT(DECIMAL(6,2), (CONVERT(DECIMAL(6,2), var5) / CONVERT(DECIMAL(6,2), 1000000)))

@马克斯是绝对正确的-

也就是说,你是整数数学的受害者。尝试:

SELECT CONVERT(DECIMAL(10,2), (var5 / 1000000.0)) 
由于您将数字存储为字符串,SQL Server可能会在应用筛选器之前尝试使用非数字数据执行此计算,因此您可以说:

SELECT CONVERT(DECIMAL(10,2), (CASE WHEN ISNUMERIC(var5) = 1 THEN var5 END / 1000000.0))
[.]

如果这不起作用,那么你有一些坏数据。如果以下操作有效,但小数位数过多:

select 
    var1, ...,
    CONVERT(DECIMAL(10,2), var5) / 1000000 as [Number] 
然后尝试使用额外的转换将其包装:

select 
    var1, ...,
    CONVERT(DECIMAL(10,2), CONVERT(DECIMAL(10,2), var5) / 1000000) as [Number]
总而言之,为什么不能在表示层格式化这个数字


另外,请不要对列别名使用“单引号”,它错误地使列别名看起来像字符串IMHO。使用[方括号]或避免使用关键字作为别名。

@marc\u s绝对正确-

DECLARE @MyTable TABLE
(
    ColA VARCHAR(50) NOT NULL
);
INSERT INTO @MyTable (ColA) VALUES ('1250000');
INSERT INTO @MyTable (ColA) VALUES ('125');
INSERT INTO @MyTable (ColA) VALUES ('12');
INSERT INTO @MyTable (ColA) VALUES ('1');
INSERT INTO @MyTable (ColA) VALUES ('');
INSERT INTO @MyTable (ColA) VALUES ('e5');
INSERT INTO @MyTable (ColA) VALUES ('0x34abc');

SELECT  *, 
        w.ColB / 1000000.0 AS ColC,
        CONVERT(NUMERIC(4,2), w.ColB / 1000000.0) AS ColD, -- The result is rounded to 2 decimals; You should change default precision (4) and scale (2)
        STR(w.ColB / 1000000.0, 5, 2) AS ColE, -- The result is rounded to 2 decimals; You should change default lenght (5) and scale (2)       
        w.ColB * 1.0 / POWER(10, ColLength-1) AS ColF
FROM
(
    SELECT  *,
            CASE 
                -- It assumes that all values are INT[egers] without sign (+/-)
                WHEN PATINDEX('%[^0-9]%', RTRIM(LTRIM(v.ColA))) = 0 AND LEN(LTRIM(v.ColA)) BETWEEN 1 AND 11 THEN CONVERT(INT, v.ColA)
                ELSE NULL -- It returns NULL if the value cann't be converted to INT
            END AS ColB,
            LEN(LTRIM(v.ColA)) AS ColLength
    FROM    @MyTable v
) w
也就是说,你是整数数学的受害者。尝试:

SELECT CONVERT(DECIMAL(10,2), (var5 / 1000000.0)) 
由于您将数字存储为字符串,SQL Server可能会在应用筛选器之前尝试使用非数字数据执行此计算,因此您可以说:

SELECT CONVERT(DECIMAL(10,2), (CASE WHEN ISNUMERIC(var5) = 1 THEN var5 END / 1000000.0))
[.]

如果这不起作用,那么你有一些坏数据。如果以下操作有效,但小数位数过多:

select 
    var1, ...,
    CONVERT(DECIMAL(10,2), var5) / 1000000 as [Number] 
然后尝试使用额外的转换将其包装:

select 
    var1, ...,
    CONVERT(DECIMAL(10,2), CONVERT(DECIMAL(10,2), var5) / 1000000) as [Number]
总而言之,为什么不能在表示层格式化这个数字

另外,请不要对列别名使用“单引号”,它错误地使列别名看起来像字符串IMHO。使用[方括号]或避免使用关键字作为别名

DECLARE @MyTable TABLE
(
    ColA VARCHAR(50) NOT NULL
);
INSERT INTO @MyTable (ColA) VALUES ('1250000');
INSERT INTO @MyTable (ColA) VALUES ('125');
INSERT INTO @MyTable (ColA) VALUES ('12');
INSERT INTO @MyTable (ColA) VALUES ('1');
INSERT INTO @MyTable (ColA) VALUES ('');
INSERT INTO @MyTable (ColA) VALUES ('e5');
INSERT INTO @MyTable (ColA) VALUES ('0x34abc');

SELECT  *, 
        w.ColB / 1000000.0 AS ColC,
        CONVERT(NUMERIC(4,2), w.ColB / 1000000.0) AS ColD, -- The result is rounded to 2 decimals; You should change default precision (4) and scale (2)
        STR(w.ColB / 1000000.0, 5, 2) AS ColE, -- The result is rounded to 2 decimals; You should change default lenght (5) and scale (2)       
        w.ColB * 1.0 / POWER(10, ColLength-1) AS ColF
FROM
(
    SELECT  *,
            CASE 
                -- It assumes that all values are INT[egers] without sign (+/-)
                WHEN PATINDEX('%[^0-9]%', RTRIM(LTRIM(v.ColA))) = 0 AND LEN(LTRIM(v.ColA)) BETWEEN 1 AND 11 THEN CONVERT(INT, v.ColA)
                ELSE NULL -- It returns NULL if the value cann't be converted to INT
            END AS ColB,
            LEN(LTRIM(v.ColA)) AS ColLength
    FROM    @MyTable v
) w
结果:

ColA    ColB    ColLength ColC        ColD ColE  ColF
------- ------- --------- ----------- ---- ----- --------------
1250000 1250000 7         1.250000000 1.25  1.25 1.250000000000
125     125     3         0.000125000 0.00  0.00 1.250000000000
12      12      2         0.000012000 0.00  0.00 1.200000000000
1       1       1         0.000001000 0.00  0.00 1.000000000000
        NULL    0         NULL        NULL NULL  NULL
e5      NULL    2         NULL        NULL NULL  NULL
0x34abc NULL    7         NULL        NULL NULL  NULL
结果:

ColA    ColB    ColLength ColC        ColD ColE  ColF
------- ------- --------- ----------- ---- ----- --------------
1250000 1250000 7         1.250000000 1.25  1.25 1.250000000000
125     125     3         0.000125000 0.00  0.00 1.250000000000
12      12      2         0.000012000 0.00  0.00 1.200000000000
1       1       1         0.000001000 0.00  0.00 1.000000000000
        NULL    0         NULL        NULL NULL  NULL
e5      NULL    2         NULL        NULL NULL  NULL
0x34abc NULL    7         NULL        NULL NULL  NULL


要添加在SQLServer2000中运行良好的第一个查询字符串;由于最近的升级,我遇到了一些问题。你应该用相关信息编辑你的问题,而不是发表评论。你能试试吗?castvar5为小数10,2/1000000-你应该始终使用最合适的数据类型-毕竟,这就是他们的目的!不要在varchar列中存储数值!Yosi,很接近。现在我得到了1.250000000等。我想添加第一个查询字符串,该字符串在SQL server 2000中运行良好;由于最近的升级,我遇到了一些问题。你应该用相关信息编辑你的问题,而不是发表评论。你能试试吗?castvar5为小数10,2/1000000-你应该始终使用最合适的数据类型-毕竟,这就是他们的目的!不要在varchar列中存储数值!Yosi,很接近。现在我得到了1.250000000等。这一个产生了错误:[Err]22003-[SQL Server]算术溢出错误将nvarchar转换为数据类型数值。这一个产生了错误:[Err]22003-[SQL Server]算术溢出错误将nvarchar转换为数据类型数值。这一个产生了[Err]22003-[SQL Server]将int转换为数据类型numeric时出现算术溢出错误。此错误导致将int转换为数据类型numeric时出现[Err]22003-[SQL Server]算术溢出错误。这导致将nvarchar转换为数据类型numeric时出现[Err]22003-[SQL Server]算术溢出错误。我知道不能把数字当作字符串来存储——我的双手被绑住了。不是我的DB;我只是那个试图修复它的人非常感谢所有的建议。更新了答案,SQL Server可能在筛选之前应用了计算,并尝试划分垃圾数据。嗯。修复程序在将nvarchar转换为数据类型numeric时出现相同错误-[Err]22003-[SQL Server]算术溢出错误。@user2697262和/1000000有效吗?你能把样本数据缩小到一个导致问题的值吗?亚伦,你是我的新英雄。CONVERTDECIMAL10,2,CONVERTDECIMAL10,2,var5/1000000成功。这导致[Err]22003-[SQL Server]将nvarchar转换为数据类型numeric时出现算术溢出错误。我知道不能把数字当作字符串来存储——我的双手被绑住了。不是我的DB;我只是那个试图修复它的人非常感谢所有的建议。更新了答案,SQL Server可能在筛选之前应用了计算,并尝试划分垃圾数据。嗯。修复程序在将nvarchar转换为数据类型numeric时出现相同的错误-[Err]22003-[SQL Server]算术溢出错误。@user2697262 An
d/1000000工程?你能把样本数据缩小到一个导致问题的值吗?亚伦,你是我的新英雄。CONVERTDECIMAL10,2,CONVERTDECIMAL10,2,var5/1000000成功了。