调试一些与财务相关的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)可以正常工作.
解决方法
正如浮点类型的添加不准确一样,如果超出精度,则十进制类型的乘法可能不准确(或导致不准确).见
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.
原文地址:https://www.jb51.cc/mssql/84014.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。