大家好日子。我喜欢我的测试环境和我的生产环境之间的奇怪差异。我有一个表将数据存储为浮点数。我在两者上运行以下脚本,结果不同:
insert into myTable(myFloat)
select top 1 26.1295 as foo
Select myFloat from myTable
Server A = 26.1295
Server B = 26.129499435424805
导致此问题的服务器设置之间是否存在差异?任何想法都会有很大帮助。
由于
答案 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)
永远不要考虑将浮动用于任何你要进行计算的东西。它不是一个确切的数据类型,您的计算中会出错。您需要更改结构以使用数字或十进制数据类型(不要忘记允许一些额外的位置来对值进行除法和乘法)。