首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server奇怪的天花板()行为

问SQL Server奇怪的天花板()行为
EN

Stack Overflow用户
提问于 2014-10-03 00:35:39
回答 2查看 395关注 0票数 1

有人能解释一下SQL Server中的以下结果吗?我被难住了。

代码语言:javascript
复制
declare @mynum float = 8.31

select ceiling( @mynum*100)

831格式的结果

代码语言:javascript
复制
declare @mynum float = 8.21

select ceiling( @mynum*100)

822格式的结果

我已经测试了一系列数字(在SQL Server 2012中)。一些增加了,而另一些保持不变。我不明白为什么天花板对待他们中的一些人是不同的。从float更改为decimal(18,5)似乎可以解决这个问题,但我担心这样做可能会遗漏其他影响。任何解释都会有所帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-10-03 00:39:39

我认为这就是所谓的浮动精度。你可以在几乎所有的编程语言和数据库中找到它。

在SQL server documentation page 上,你可以读到:

近似值-用于浮点数值型数据的数据类型。浮点数据是近似值;因此,并非数据类型范围内的所有值都可以精确表示。

在其他数据库系统中也存在同样的问题。例如,在mysql website,你可以读到:

浮点数有时会引起混淆,因为它们是近似值,并不存储为精确值。SQL语句中写入的浮点值可能与内部表示的值不同。尝试在比较中将浮点值视为精确可能会导致问题。它们还受到平台或实现依赖关系的影响。浮点型和双精度数据类型会受到这些问题的影响。对于十进制列,MySQL执行精度为65个小数位的操作,这应该可以解决大多数常见的不准确问题。

票数 3
EN

Stack Overflow用户

发布于 2014-10-15 11:00:09

浮点数不是100%准确。就像Marcin Nabiałek写的那样,你看到的8.31值可能是由其他东西表示的,比如8.310000000001。有关浮点精度问题的一些有趣读物,请参阅here。

解决方案是,除非确实有必要,否则不要使用浮点数据类型。您应该使用DECIMAL或MONEY数据类型。

如果你真的必须使用浮点数据类型,那么你可以在每个floor,ceiling或比较操作之前添加或减去一个较小的值(精度阈值或ε),以获得你想要的精度。如果你有很多浮点运算,那么编写你自己的floating point comparison functions可能是值得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26165358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档