在 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.2819673100
但是,如果将被除的 2 个数字转换为 float ,则似乎可行:
....
Select @z = cast(@y as float)/cast(@x as float)
select @z
结果:2.2819673181
Sql 为什么要这样做?在 Sql 中,在不损失精度的情况下除小数的正确方法是什么?
最佳答案
SQL Server 中允许的最大精度为 38。您正在使用 Decimal(30,10)。最大值为 99,999,999,999,999,999,999.9999999999,如果将此数字除以 0.000000001,最终将得到一个更大的数字,因此生成的数据类型必须能够容纳它。这会导致您失去一些精度。
将你原来的数据类型改为Decimal(20,10)就不会出现这个问题了。
有关数据类型的完整规则(以及它们如何受数学运算影响):
关于Sql Server Decimal(30,10) 丢失最后 2 位小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1455547/