为什么查询输出不同,即使两个查询都相同?

时间:2013-12-24 05:58:05

标签: sql sql-server sql-server-2008

我正在使用SQL 2008并运行以下查询。

Select ROUND(53.67*0.75,3)

这给了我结果= 40.2530

但同样的事情,如果我检查存储在表格中的数据,它会给我不同的输出原因吗?

Create table CalCheck
(GrossWeight float, Rate float) 
Go
Insert into CalCheck values (53.67,0.75)
GO
Select ROUND(GrossWeight*Rate,3) from CalCheck

以上查询给出结果= 40.252

为什么显示0.001差异?

1 个答案:

答案 0 :(得分:4)

这是因为SQL SERVER在第一个示例中将值解释为DECIMALS

Select ROUND(53.67*0.75,3)

而您指定的第二个示例是FLOATS

看一下这个例子

SQL Fiddle DEMO

除此之外,您还可以查看SQL_VARIANT_PROPERTY

  

返回基本数据类型和有关sql_variant的其他信息   值。

Select  sql_variant_property(53.67*0.75,'BaseType') BaseType, 
        sql_variant_property(53.67*0.75,'Precision') [Precision], 
        sql_variant_property(53.67*0.75,'scale') [Scale]

来自Using decimal, float, and real Data

  

浮点数和实数数据类型称为近似数据类型。 float和real的行为遵循IEEE 754规范   近似数字数据类型。

     

近似数值数据类型不存储指定的确切值   很多数字;他们存储了非常接近的近似值   值。对于很多应用来说,微小的区别   指定值和存储的近似值不明显。在   但是,时间差异变得明显。因为   浮点数和实数数据类型的近似性质,请勿使用这些   需要精确数字行为时的数据类型,例如   财务申请,涉及四舍五入的业务,或在   平等检查。而是使用整数,小数,金钱或   smallmoney数据类型。

     

IEEE 754规范提供了四种舍入模式:舍入到   最近,向上,向下,向下舍入到零。 Microsoft SQL Server   用尽了。 所有都精确到保证精度,但可以   导致浮点值略有不同。因为二进制   浮点数的表示可以使用许多合法的数字之一   舍入方案,不可能可靠地量化a   浮点值。