我已将产品上传到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
如果将数据库(本地,Azure SQL数据库托管实例或Azure SQL数据库)的数据库兼容性级别更改为120(SQL 2016):
ALTER DATABASE YourDatabase SET COMPATIBILITY_LEVEL = 120;
并重复相同的查询,则结果会像SQL 2016实例那样错误地舍入:
float rounded
------------------------ ------------------------
7.4999999999999997E-3 8.0000000000000002E-3
请记住,float是近似值,不能精确表示所有十进制值。因此,Azure SQL数据库是正确的舍入行为,但是可以根据需要使用数据库兼容性级别控制该行为,以提供向后兼容性。