首页 > 解决方案 > SQL Server 十进制除法不四舍五入结果

问题描述

我尝试了下面的乘法和除法,并期望与舍入相同的结果。这两个操作的结果类型都是 Decimal(38,6) 我想知道为什么在除法的情况下结果不四舍五入?

结果应根据以下链接对乘法和除法进行四舍五入 在 此处输入链接描述

select cast(1.225114854 as decimal(38, 9)) * cast(1.000000000 as decimal(28, 9)) as multiply 

结果:1.225115

select cast(1.225114854 as decimal(38, 9)) / cast(1.000000000 as decimal(28, 9)) as division

结果:1.225114

select 1.225114854 / 1.000000000

结果:1.22511485400000000000

标签: sql-serverdecimal

解决方案


SQL Server 在十进制数的乘法和除法情况下的行为方式不同,因此位数不同:

假设,e1=decimal(p1,s1) and e2=decimal(p2,s2)

Operation   Result precision                        Result scale *
e1 + e2     max(s1, s2) + max(p1-s1, p2-s2) + 1     max(s1, s2)
e1 - e2     max(s1, s2) + max(p1-s1, p2-s2) + 1     max(s1, s2)
e1 * e2     p1 + p2 + 1                             s1 + s2
e1 / e2     p1 - s1 + s2 + max(6, s1 + p2 + 1)      max(6, s1 + p2 + 1)

结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减小,以防止结果的整数部分被截断。

因此,当您乘以 38 位精度小数时,结果会被截断。您可以使用以下计算来获得更好的结果:

select cast(1.225114854 as decimal(15,9))*cast(1.000000000  as decimal(15,9)) as multiply
select cast(1.225114854 as decimal(15,9))/cast(1.000000000  as decimal(15,9)) as division

以下链接应该可以澄清您的大部分疑问:

https://www.codeproject.com/Articles/769823/Losing-Precision-After-Multiplication-in-SQL-Serve


推荐阅读