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

标签 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.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)就不会出现这个问题了。

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

Full rules here

关于Sql Server Decimal(30,10) 丢失最后 2 位小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1455547/

相关文章:

mysql - SQL ORDER BY 与 UNION

SQL查询填充0的缺失数据

sql - 我怎么能有像 SELECT id, (id in(2,3,4) ) as idIs234 来自 Messageset

SQL:避免硬编码或魔数(Magic Number)

SQL 在 Isnull 列上使用Where

sql - BigQuery : Format ISO Date

Mysql - 只有一列中的值与其他列中的所有行相匹配

sql - 更改 SQL 表以添加列

sql - 允许 null 的 ORDER BY 列速度很慢。为什么?

sql - 执行后重命名存储过程多列