求和的小数舍入?

SAL*_*NTA 5 sql decimal rounding

我正在使用下表编写SQLServer 2008:

id      user      program   seconds
------------------------------------
9999  'user01'    'pr01'       5
Run Code Online (Sandbox Code Playgroud)

列'秒'定义为小数(14,0),表中唯一的行是显示的行.

所以我尝试了一些问题:

Q1:

select seconds*0.95 from myTable
union all
select seconds from myTable
Run Code Online (Sandbox Code Playgroud)

它给出了我期望的结果:

4.75
5.00
Run Code Online (Sandbox Code Playgroud)

Q2:

select sum(seconds)*0.95 from myTable
union all
select sum(seconds) from myTable
Run Code Online (Sandbox Code Playgroud)

我期待与第一季度相同的结果,但我得到的结果是:

5
5
Run Code Online (Sandbox Code Playgroud)

Q3:

select sum(seconds)*0.95 from myTable
union all
select sum(seconds)*1.00 from myTable
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到了我期望的结果:

4.75
5.00
Run Code Online (Sandbox Code Playgroud)

所以,我想知道为什么Q2没有得到预期的结果.我尝试了相同的例子,'秒'是十进制(2,0)并且工作正常,所以我猜它与小数的大小有关,但在这种情况下,我无法弄清楚为什么Q1和Q3工作时Q2没有.

Mar*_*ith 4

的结果sum(seconds)numeric(38,0)有意义的,因为您可以对任意数量的numeric(14,0)行求和,这可以避免溢出较小的类型。

将顶部的anumeric(38,0)乘以0.95( ) 得出的结果如下所示numeric(2,2)numeric(38,2)

但是底部的部分unionnumeric(38,0)这样的,结果作为一个整体被强制转换为numeric(38,0)这又是有意义的,因为numeric(38,2)总是可以毫无错误地强制转换numeric(38,0)(尽管小数点后的数字丢失),但以其他方式强制转换根本不起作用非常大的数字。

您可以显式转换底部部分来numeric(38,2)避免这种情况。

SELECT sum(seconds) * 0.95 AS S
FROM   myTable
UNION ALL
SELECT CAST(sum(seconds) AS NUMERIC(38, 2))
FROM   myTable 
Run Code Online (Sandbox Code Playgroud)