我在 SQL Server Management Studio 中运行此示例:

SELECT CONVERT(REAL, -2101.12) n INTO #t
SELECT * FROM #t
SELECT SUM(n) FROM #t

第一个 SELECT 创建一个临时表 #t ,其中 1 列 n 类型为 real,并在其中放置 1 行,其值为 -2101.12

第二个 SELECT 确认表是用预期的内容创建的,结果是:
n
---------
-2101.12

第三个 SELECT 对存在的唯一数字求和,但结果是:
-2101.1201171875

所以问题是:0.0001171875 来自哪里?

编辑: 我知道实数和浮点数据类型缺乏精度,不幸的是我因此无法更改数据库架构。但令我惊讶的是,我希望在第二个选择中也能看到额外的小数,因为它应该以缺乏精度的方式存储。既然它不会在第二次选择时发生,那么为什么 sum 函数会选择它呢?

最佳答案

FLOATREAL 数据类型被称为近似数据类型。 FLOATREAL 的行为遵循关于近似数值数据类型的 IEEE 754 规范。

近似数字数据类型不存储为许多数字指定的确切值;它们存储非常接近的值。对于许多应用程序,指定值和存储的近似值之间的微小差异是不明显的。但是,有时差异会变得很明显。由于 FLOATREAL 数据类型的近似性质,当需要精确的数值行为时不要使用这些数据类型,例如在金融应用程序中、在涉及舍入的操作中或在相等性检查中。相反,请使用整数、小数、货币或小货币数据类型。
避免在 FLOAT 子句搜索条件中使用 REALWHERE 列,尤其是使用 =<> 运算符。最好使用 FLOATREAL 比较来限制 >< 列。

Source of above statement

关于sql-server - SQL Server : SUM() weird behaviour,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20354604/

10-12 20:35