SQL Server的十进制(30,10)失去最后的2位小数(Sql Server Decimal(

2019-07-18 19:28发布

当2位小数(30,10)数在SQL Server 05分,最后2位小数似乎迷路(甚至没有四舍五入,只需截断)。

例如:

Declare @x decimal(30,10)
Declare @y decimal(30,10)
Declare @z decimal(30,10)

select @x = 2.1277164747 
select @y = 4.8553794574

Select @z = @y/@x   
select @z 

结果:2.28196731 00

但是,如果2号被划分转换为浮动,似乎工作:

....
Select @z = cast(@y as float)/cast(@x as float)
select @z 

结果:2.28196731 81

为什么在SQL这样做呢? 什么是小数除以没有在SQL失去精度的正确方法。

Answer 1:

允许SQL Server中的最大精度为38.您正在使用十进制(30,10)。 最大值为99,999,999,999,999,999,999.9999999999如果您通过0.000000001除以这个数字,你将最终获得一个更大的数字,所以得出的数据类型必须能适应它。 这会导致你失去一些精度。

更改原始数据类型为十进制(20,10),并不会出现此问题。

有关数据类型(以及他们如何通过数学运算的影响)完整的规则:

这里完整的规则



Answer 2:

总之,使用铸造,以保证您的结果。 当您指定@x和@y字面值,他们可能采用这些文字的精度。 这有助于解释为什么这些价值观分裂出现短你的期望。



文章来源: Sql Server Decimal(30,10) losing last 2 decimals