SQL 服务器 RTM 版本未四舍五入
SQL Server RTM version is not rounding up number
我已将我的产品上传到 Azure 和 SQL 服务器,但我发现在使用 Azure 时遇到了非常有趣的问题。默认情况下,Azure 提供 SQL 服务器的 RTM 版本,这会导致此问题。
用于计算的 RTM 版本图像 - 屏幕截图显示了计算如何输出值。
第二张截图是我本地的SQLServer 2014 - 为什么RTM版会有这个问题?是否有任何设置或解决方案可以像 SQL Server 2014 那样 return 正确的值?
十进制 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
请记住,浮点数是近似值,不能精确表示所有小数值。所以 Azure SQL 数据库是正确的舍入行为,但如果需要,可以使用数据库兼容级别控制该行为以提供向后兼容性。
我已将我的产品上传到 Azure 和 SQL 服务器,但我发现在使用 Azure 时遇到了非常有趣的问题。默认情况下,Azure 提供 SQL 服务器的 RTM 版本,这会导致此问题。
用于计算的 RTM 版本图像 - 屏幕截图显示了计算如何输出值。
第二张截图是我本地的SQLServer 2014 - 为什么RTM版会有这个问题?是否有任何设置或解决方案可以像 SQL Server 2014 那样 return 正确的值?
十进制 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
请记住,浮点数是近似值,不能精确表示所有小数值。所以 Azure SQL 数据库是正确的舍入行为,但如果需要,可以使用数据库兼容级别控制该行为以提供向后兼容性。