我已将产品上传到Azure和SQL Server,但是我发现使用Azure确实很有趣。默认情况下,Azure提供了SQL Server的RTM版本,此问题正在产生。
用于计算的RTM版本图像-屏幕截图显示了计算如何输出值。
第二个屏幕截图是我的本地SQL Server 2014-那么为什么RTM版本存在此问题?是否有任何设置或解决方案可以像SQL Server 2014中那样返回正确的值?
十进制0.00750是当转换为浮点值时的值7.4999999999999997E-3(尽管SSMS将显示0.0075)。使用SQLCMD,您可以看到实际值:
sqlcmd -Q"DECLARE @c float = 0.00750;SELECT @c as float,ROUND(@c, 3) AS rounded;"
结果:
float rounded
------------------------ ------------------------
7.4999999999999997E-3 7.0000000000000001E-3
如果将数据库兼容性级别更改为120(SQL 2016),
ALTER DATABASE YourDatabase SET COMPATIBILITY_LEVEL = 120;
并重复相同的查询,然后结果被错误舍入为类似于您的SQL 2016实例:
float rounded
------------------------ ------------------------
7.4999999999999997E-3 8.0000000000000002E-3
[请记住,浮点数是近似值,不能完全代表所有十进制值。因此,Azure SQL数据库是正确的舍入行为,但是可以根据需要使用数据库兼容性级别控制该行为以提供向后兼容性。