调试一些与金融相关的 SQL 代码时,发现 numeric(24,8) 精度存在奇怪问题。
在 MSSQL 上运行以下查询,您会得到 A + B * C 表达式的结果是 0.123457:
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
因此,我们失去了 2 个重要的数字。尝试以不同的方式解决这个问题后,我得出结论:将中间乘法结果(即零)转换为 numeric(24,8) 将正常工作。
最终我有了一个解决方案。但我仍有一个问题——MSSQL 为什么会以这种方式行事,并且我的样本中实际发生了哪些类型转换?
NUMERIC(p, s)
中,p
代表精度的总位数。所以在NUMERIC(24, 8)
中,有16个非小数位数字。没有位。再次,请阅读链接到msdn文档。 - Eugene Yokota