有人能解释一下SQL Server中的以下结果吗?我被难住了。
declare @mynum float = 8.31
select ceiling( @mynum*100)831格式的结果
declare @mynum float = 8.21
select ceiling( @mynum*100)822格式的结果
我已经测试了一系列数字(在SQL Server 2012中)。一些增加了,而另一些保持不变。我不明白为什么天花板对待他们中的一些人是不同的。从float更改为decimal(18,5)似乎可以解决这个问题,但我担心这样做可能会遗漏其他影响。任何解释都会有所帮助。
发布于 2014-10-03 00:39:39
我认为这就是所谓的浮动精度。你可以在几乎所有的编程语言和数据库中找到它。
在SQL server documentation page 上,你可以读到:
近似值-用于浮点数值型数据的数据类型。浮点数据是近似值;因此,并非数据类型范围内的所有值都可以精确表示。
在其他数据库系统中也存在同样的问题。例如,在mysql website,你可以读到:
浮点数有时会引起混淆,因为它们是近似值,并不存储为精确值。SQL语句中写入的浮点值可能与内部表示的值不同。尝试在比较中将浮点值视为精确可能会导致问题。它们还受到平台或实现依赖关系的影响。浮点型和双精度数据类型会受到这些问题的影响。对于十进制列,MySQL执行精度为65个小数位的操作,这应该可以解决大多数常见的不准确问题。
发布于 2014-10-15 11:00:09
浮点数不是100%准确。就像Marcin Nabiałek写的那样,你看到的8.31值可能是由其他东西表示的,比如8.310000000001。有关浮点精度问题的一些有趣读物,请参阅here。
解决方案是,除非确实有必要,否则不要使用浮点数据类型。您应该使用DECIMAL或MONEY数据类型。
如果你真的必须使用浮点数据类型,那么你可以在每个floor,ceiling或比较操作之前添加或减去一个较小的值(精度阈值或ε),以获得你想要的精度。如果你有很多浮点运算,那么编写你自己的floating point comparison functions可能是值得的。
https://stackoverflow.com/questions/26165358
复制相似问题