SQL Server的CEILING函数将100取整后得到的结果是101?

12 浏览
0 Comments

SQL Server的CEILING函数将100取整后得到的结果是101?

我在SQL Server 2012中发现了一个非常奇怪的行为,CEILING函数对于100的结果有时是101,有时是100。

我需要按照2位小数获取一个数的上限,也就是将0.254转换为0.26。

所以我尝试运行以下代码:

SELECT CEILING(field * 100.0) / 100.0 
FROM Table

这应该是有效的,而且对于大部分数据确实有效。

有什么解决方法吗?

这是奇怪行为的示例

0
0 Comments

你在这里看到的是浮点误差。当你将一个数字存储在浮点列中时,它并不是精确的,所以数字1实际上可能是1.0000000000000000000000001。所以将它乘以100会得到一个比100稍微大一点的数字,因此CEILING将它四舍五入为101。

解决方法是首先对数字进行四舍五入,这将消除浮点误差。注意,我使用了5作为小数位数,你需要根据自己的精度需求来决定。

SELECT CEILING(ROUND(field,5)*100.0)/100.0 FROM Table

我应该在应用CEILING之前将其四舍五入到10位小数吗?这似乎是一个变通方法。我应该如何正确处理这个问题?

也许不需要10位小数,你的应用程序真正需要多少位小数?超过2位小数的情况很少见,但只有你了解你的问题领域。

0