我有一个表的字段数据类型设置为float。给定记录集的值应该给出1的总和,并且select中的字段返回1但是,HAVING子句另有说明。
以下是我在表格中的确切值,正如您所看到的,此示例执行相同的操作。为什么总和超过1?我迷路了!
with example as (
SELECT 'Code' as Code, cast(0.462 as float) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.116 as float) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.181 as float) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.053 as float) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.188 as float) as perc
)
SELECT
Code,
SUM(perc)
FROM
example
GROUP BY Code
HAVING SUM(perc) > 1
答案 0 :(得分:8)
我认为你误解了漂浮物。我并不是说,以一种光顾的方式,不幸的是,大多数人都误解了花车。
浮点数能够重新缩放"他们自己。能够容纳大量数字或小数字,都在相同的数据类型中。这并不意味着它们是无限精确的。这只意味着他们有一个他们可以覆盖的极端范围。但是,它们会为这种灵活性付出代价。它们具有舍入误差,因为它们是十进制数的二进制近似值。
如果您想了解更多信息,网上有很多内容。一开始它与人们的头脑混在一起,但一旦你理解了你就会变得更好,更安全,更聪明。
因此,对于您的情况,如果您想保留确切的值,请不要使用浮点数据类型。改为使用定点数据类型。
如果您从FLOAT
更改为DECIMAL(9,4)
之类的内容,那么您将无法获得与浮点数相关的舍入错误。
但您无法在其中存储0.12345
,但您需要为此指定DECIMAL(9,5)
。但是,您将始终保证您可以存储的任何数字都将被准确存储,而不是大约存储。
答案 1 :(得分:3)
因为FLOAT
不是精确的数字类型,所以存在浮点近似值。尝试使用DECIMAL
或NUMERIC
:
with example as (
SELECT 'Code' as Code, cast(0.462 as NUMERIC(5,3)) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.116 as NUMERIC(5,3)) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.181 as NUMERIC(5,3)) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.053 as NUMERIC(5,3)) as perc
UNION ALL
SELECT 'Code' as Code, cast(0.188 as NUMERIC(5,3)) as perc
)
SELECT
Code,
SUM(perc)
FROM
example
GROUP BY Code
HAVING SUM(perc) > 1