我们正在验证从一个SQL Server迁移到另一个SQL Server的数据。其中之一我们要验证的是一些数值数据是否正确地转移了。在新系统中,数值数据以浮点数(float)数据类型存储。
我们知道浮点数存在许多问题,不能保证精确的数字准确性,并且无法使用精确等式比较浮点数据。我们无法控制数据库模式和数据类型,这些都是不同的问题。
在这个特定案例中,我们试图验证某些比率值是否正确地传输。其中一条具体的数据验证规则是所有比率值都应该在小数点右侧没有超过4位。
例如,有效的比率看起来像:
我们想要做的是计算小数点右侧的数字数量,并找到所有浮点值右侧有超过四个数字的情况。我们一直在使用SUBSTRING、LEN、STR和其他一些函数来实现这一点,如果我们将数字字段类型设置为十进制并将其转换为字符,则肯定会起作用。然而,当尝试将浮点数转换为字符值时,我们发现SQL Server似乎总是在两者之间转换为十进制。例如,查询SQL Server Enterprise Manager中的字段时显示此值:
返回此值:
在SQL Server中,是否有一种直接将浮点数转换为字符的方法,而不需要经过看起来是中间步骤的十进制转换?我们还尝试了CAST和CONVERT函数,并且得到了与STR函数类似的结果。涉及的SQL Server版本为:SQL Server 2012 SP2。谢谢。
我们知道浮点数存在许多问题,不能保证精确的数字准确性,并且无法使用精确等式比较浮点数据。我们无法控制数据库模式和数据类型,这些都是不同的问题。
在这个特定案例中,我们试图验证某些比率值是否正确地传输。其中一条具体的数据验证规则是所有比率值都应该在小数点右侧没有超过4位。
例如,有效的比率看起来像:
.7542
1.5423
无效比率包括:
.12399794301
12.1209377
我们想要做的是计算小数点右侧的数字数量,并找到所有浮点值右侧有超过四个数字的情况。我们一直在使用SUBSTRING、LEN、STR和其他一些函数来实现这一点,如果我们将数字字段类型设置为十进制并将其转换为字符,则肯定会起作用。然而,当尝试将浮点数转换为字符值时,我们发现SQL Server似乎总是在两者之间转换为十进制。例如,查询SQL Server Enterprise Manager中的字段时显示此值:
1.4667
尝试使用SQL Server推荐的函数将其转换为字符串:
LTRIM(RTRIM(STR(field_name, 22, 17)))
返回此值:
1.4666999999999999
如果SQL Server直接从float转换为char(然后我们可以从中删除尾随的零),我期望的值是:
1.4667000000000000
在SQL Server中,是否有一种直接将浮点数转换为字符的方法,而不需要经过看起来是中间步骤的十进制转换?我们还尝试了CAST和CONVERT函数,并且得到了与STR函数类似的结果。涉及的SQL Server版本为:SQL Server 2012 SP2。谢谢。
1.4666999999999999
。当您在企业管理器中选择它时,它会为您四舍五入。 - Tom H