加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL server 2005数字精度损失

发布时间:2021-02-20 08:43:51 所属栏目:MsSql教程 来源:网络整理
导读:调试一些与财务相关的SQL代码发现了数学(24,8)数学精度的奇怪问题. 在MSSQL上运行以下查询,您将获得A B * C表达式结果为0.123457 选择一个, B, C, A B * C. 从 ( SELECT CAST(0.12345678 AS NUMERIC(24,8))AS A, CAST(0 AS NUMERIC(24,8))AS B, CAST(500 AS N

调试一些与财务相关的SQL代码发现了数学(24,8)数学精度的奇怪问题.

在MSSQL上运行以下查询,您将获得A B * C表达式结果为0.123457

选择一个,
B,
C,
A B * C.

(
SELECT CAST(0.12345678 AS NUMERIC(24,8))AS A,
CAST(0 AS NUMERIC(24,8))AS B,
CAST(500 AS NUMERIC(24,8))AS C
)T

所以我们失去了两个重要的符号.试图以不同的方式解决这个问题,我将中间乘法结果(即零!)转换为数字(24,8)可以正常工作.

最后一个有解决方案.但我还有一个问题 – 为什么MSSQL会以这种方式运行,以及我的样本中实际发生了哪种类型的转换?

解决方法

正如浮点类型的添加不准确一样,如果超出精度,则十进制类型的乘法可能不准确(或导致不准确).见 Data Type Conversion和 decimal and numeric.

由于您将NUMERIC(24,8)和NUMERIC(24,8)相乘,而SQL Server只检查类型而不是内容,它可能会尝试保存潜在的16位非小数位数(24 – 8)不保存所有48位数的精度(最大值为38).结合其中两个,你得到32个非十进制数字,只剩下6位十进制数字(38 – 32).

因此原始查询

SELECT A,B,C,A + B * C
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,CAST(0 AS NUMERIC(24,8)) AS B,CAST(500 AS NUMERIC(24,8)) AS C ) T

减少到

SELECT A,A + D
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS C,CAST(0 AS NUMERIC(38,6)) AS D ) T

同样,在NUMERIC(24,8)和NUMERIC(38,6)之间,SQL Server将尝试保存潜在的32位非小数,因此A D减少到

SELECT CAST(0.12345678 AS NUMERIC(38,6))

四舍五入后给你0.123457.

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读