我正在使用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差异?
答案 0 :(得分:4)
这是因为SQL SERVER在第一个示例中将值解释为DECIMALS
Select ROUND(53.67*0.75,3)
而您指定的第二个示例是FLOATS
看一下这个例子
除此之外,您还可以查看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 浮点值。