我在 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 函数会选择它呢?
最佳答案
FLOAT
和 REAL
数据类型被称为近似数据类型。 FLOAT
和 REAL
的行为遵循关于近似数值数据类型的 IEEE 754
规范。
近似数字数据类型不存储为许多数字指定的确切值;它们存储非常接近的值。对于许多应用程序,指定值和存储的近似值之间的微小差异是不明显的。但是,有时差异会变得很明显。由于 FLOAT
和 REAL
数据类型的近似性质,当需要精确的数值行为时不要使用这些数据类型,例如在金融应用程序中、在涉及舍入的操作中或在相等性检查中。相反,请使用整数、小数、货币或小货币数据类型。
避免在 FLOAT
子句搜索条件中使用 REAL
或 WHERE
列,尤其是使用 =
或 <>
运算符。最好使用 FLOAT
或 REAL
比较来限制 >
和 <
列。
Source of above statement
关于sql-server - SQL Server : SUM() weird behaviour,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20354604/