Sql server SQL Server十进制除法不舍入结果

Sql server SQL Server十进制除法不舍入结果,sql-server,decimal,Sql Server,Decimal,我尝试了下面的乘法和除法,并期望得到相同的四舍五入结果。两个操作的结果类型均为十进制(38,6) 我想知道在除法的情况下为什么结果不四舍五入 根据下面的链接,乘法和除法的结果应四舍五入 结果: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

我尝试了下面的乘法和除法,并期望得到相同的四舍五入结果。两个操作的结果类型均为十进制(38,6) 我想知道在除法的情况下为什么结果不四舍五入

根据下面的链接,乘法和除法的结果应四舍五入

结果: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.2251485400000000000

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

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

结果精度和刻度绝对最大值为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
以下链接应该能够澄清您的大部分疑问:


可以简单地用
Round()
函数来包装整个内容。我想了解为什么除法不进行舍入,而将小数位数减少到6。在乘法和除法两种情况下,结果刻度都大于6。所以这两个操作都应该对结果进行四舍五入。我提到的这个链接看起来像是在除法的情况下被截断,在乘法的情况下被舍入…SQL Server在数学计算方面有它的问题…如果您想要精确的舍入结果,请使用舍入函数确定,我需要在spark SQL中模拟这种行为。所以我试图得到澄清。我会尝试更多的例子来总结这个行为。酷,如果你发现了其他的东西,请确保你在这里添加它:)
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)
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