SQL设置指示如何存储浮点数

时间:2009-08-14 17:44:57

标签: sql sql-server-2000

大家好日子。我喜欢我的测试环境和我的生产环境之间的奇怪差异。我有一个表将数据存储为浮点数。我在两者上运行以下脚本,结果不同:

insert into myTable(myFloat)
  select top 1 26.1295 as foo

Select myFloat from myTable
Server A = 26.1295
Server B = 26.129499435424805

导致此问题的服务器设置之间是否存在差异?任何想法都会有很大帮助。

由于

3 个答案:

答案 0 :(得分:0)

根据IEEE 754 standard存储浮点数,这就是发生这种情况的原因。

如果您需要精确到该小数点,请使用decimal数据类型(或numeric,同样的事情)。请注意,它比浮点数慢一点,因为计算机本身可以进行浮点数学计算,但是一些额外的开销用于十进制/数值计算。

答案 1 :(得分:0)

实际数据类型是什么,以及如何显示值?它实际上可能是以不同方式显示的相同值。

如果您指的是MSSQL数据类型float,它对应于.NET框架中的double数据类型,则其精度约为15位。

如果您指的是MSSQL数据类型real,它对应于.NET框架中的float数据类型,则其精度约为7位。

由于任一数据类型的精度都有限,因此您无法获得分配给它的确切值。存储的值是数据类型可以表示的最接近的值,因此通常会在精度结束的位置四舍五入。如果将值26.1295存储在单个精度字段中,它实际上可能最终为26.129499435424805,因为它与字段的精度一样接近。

如何在取回时看到的值取决于您的显示方式。通常,将值转换回文本表示形式的代码也会在其中进行舍入,以便在精度结束之前停止,并且您永远不会看到差异。

如果将值作为单个精度数存储在数据库中,但在从数据库中读取时将其转换为双精度数,则可能会看到存储的值而不是在精度边缘处舍入的值。扩展转换将提高精度,但无法再添加任何信息。

答案 2 :(得分:0)

永远不要考虑将浮动用于任何你要进行计算的东西。它不是一个确切的数据类型,您的计算中会出错。您需要更改结构以使用数字或十进制数据类型(不要忘记允许一些额外的位置来对值进行除法和乘法)。