浮点数的SQL Server总和应该给出1的值,否则过滤器说

Dav*_*nte 4 sql t-sql aggregation

我有一个字段的数据类型设置为浮动的表.给定记录集的值应该给出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
Run Code Online (Sandbox Code Playgroud)

Mat*_*lie 8

我认为你误解了漂浮物.遗憾的是,我并不是说以光顾的方式,大多数人都误解了漂浮物.

浮点数能够"重新缩放"自己.能够容纳大量数字或小数字,都在相同的数据类型中.这并不意味着它们"无限精确".这只意味着他们有一个他们可以覆盖的极端范围.但是,它们会为这种灵活性付出代价.它们具有舍入误差,因为它们是十进制数的二进制近似值.

如果您想了解更多信息,网上有很多内容.一开始它会与人们的头脑混在一起,但一旦你明白,你会更好,更安全,更聪明.


因此,对于您的情况,如果要保留确切的值,请不要使用浮点数据类型.请改用定点数据类型.

如果你改变FLOAT为类似的东西,DECIMAL(9,4)你将不会得到与浮点数相关的舍入误差.

您将无法存储0.12345,但您需要为此指定DECIMAL(9,5).但是,您将始终保证您可以存储的任何数字都将被准确存储,而不是大约存储.