Sql Server Decimal(30,10)丢失最后2位小数

时间:2009-09-21 16:54:29

标签: sql sql-server tsql

当在Sql Server 05中划分2个十进制(30,10)数字时,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精度的情况下划分小数的正确方法。

2 个答案:

答案 0 :(得分:20)

SQL Server中允许的最大精度为38.您使用的是十进制(30,10)。最大值为99,999,999,999,999,999,999.9999999999如果将此数字除以0.000000001,最终会得到一个更大的数字,因此生成的数据类型必须能够容纳它。这会导致你失去一些精确度。

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

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

Full rules here

答案 1 :(得分:-1)

简而言之,使用铸造来保证您的结果。当您将@x和@y分配给文字值时,它们可能正在采用这些文字的精度。这有助于解释为什么这些价值的划分超出了您的预期。