Sql 服务器将 5 解释为较低

问题描述 投票:0回答:6

我想在 sql server 2012 中四舍五入小数,例如:

Select ROUND(1.056,2) -- returns  1.06
Select ROUND(1.055,2) -- returns  1.06
Select ROUND(1.054,2) -- returns  1.05

如何使第二个查询返回 1.05,如果 5 更小,则四舍五入第三个小数?

sql sql-server rounding sql-query-store
6个回答
1
投票

仅从字段中选择 2 位数字。这将选择第 4 个位置或第 5 个位置的大数字

 select    
 case when  right ( 'colvalue',1) >  right (SUBSTRING('colValue',1,4),1) 
 then ROUND('colvalue',2)
 else ROUND (LEFT ( 'colvalue',4) ,2) end RoundValue

1
投票

您可以使用函数作为 round() 的第三个参数。如果函数返回 0,则结果将被舍入,否则结果将被截断。

-- Syntax for SQL Server and Azure SQL Database  
ROUND ( numeric_expression , length [ ,function ] )  

SELECT round(1.055,2,1)

编辑:

这是一个完整的例子...

create table test
(
    n decimal(10,7) not null
)
GO

insert into test (n)
values 
(1.050),
(1.051),
(1.052),
(1.053),
(1.054),
(1.055),
(1.056),
(1.057),
(1.058),
(1.059)
GO

select n, round(n,2,iif(n - round(n,2,1)>.005,0,1)) as rounded from test
GO

这是结果:

n           rounded
1.0500000   1.0500000
1.0510000   1.0500000
1.0520000   1.0500000
1.0530000   1.0500000
1.0540000   1.0500000
1.0550000   1.0500000
1.0560000   1.0600000
1.0570000   1.0600000
1.0580000   1.0600000
1.0590000   1.0600000

0
投票

你可以用这个。它会对你有用。

DECLARE @test decimal(10,3) = 1.055
SELECT CASE WHEN round(@test,3,1) - round(@test,2,1) = 0.005 THEN round(@test,2,1) ELSE round(@test,2) END

0
投票

我会选择简单的:

DECLARE @test nvarchar(10)
DECLARE @test_string nvarchar(10)

SET @test_string='1.055'
-- SET @test_string='1.056' -- is here to test
SET @test = SUBSTRING(@test_string,5,5)


IF @test=5
BEGIN
   SELECT ROUND (LEFT(@test_string,4),2)
END
ELSE
BEGIN
  SELECT ROUND (@test_string,2)
END

0
投票

尝试转换舍入值:

Select CAST(ROUND(1.056,2) AS NUMERIC(10,2)) -- returns  1.06
Select CAST(ROUND(1.055,2) AS NUMERIC(10,2))  -- returns  1.06
Select CAST(ROUND(1.054,2) AS NUMERIC(10,2))  -- returns  1.05

0
投票

聚会有点晚了,但我用稍微不同的方式解决了这个问题。银行家四舍五入到底有什么作用?我只是使用嵌套 ROUND() 函数重新创建了它,因为这实际上就是我们使用银行家舍入进行舍入时所做的事情。您只需按照您的精度级别开始四舍五入,然后从那里向后计算到小数点后两位即可。

例如,如果您有 5 位小数精度的数字,您可以这样做:

SELECT ROUND(ROUND(ROUND(ROUND(54.14356, 5), 4), 3), 2) = 54.14000

它并不漂亮,我确信你可以以某种方式将它封装到一个函数中,但无论如何我只需要在一个地方,所以我只是对级联进行了硬编码。

实际上就是按照我们脑海中的方式去做:

54.14356 => 54.1436 => 54.144

对我来说很有意义!现在,如果您正在处理 18 点精度的小数...可能是时候将其放入程序中了,呵呵。

© www.soinside.com 2019 - 2024. All rights reserved.