如何在tSQLt中增加FLOAT失败的断言消息的精度?
例如
DECLARE @Expected FLOAT = -5.4371511392520810
PRINT STR(@Expected, 40, 20)
DECLARE @Actual FLOAT = @Expected - 0.0000000001
PRINT STR(@Actual, 40, 20)
EXEC tSQLt.AssertEquals @Expected, @Actual
给出
-5.4371511392520810 -5.4371511393520811
[UnitTest]。[测试A]失败:预期:< -5.43715>但是:< -5.43715>
答案 0 :(得分:2)
在大多数计算机语言(包括T-SQL)中,浮点值是近似值,因此比较FLOAT
变量是否相等往往是一个坏主意(特别是在对它们进行一些数学运算之后)。 FLOAT
变量仅精确到大约15位(默认情况下)
您可以通过在示例代码的末尾添加以下行来看到这一点:
PRINT STR((@Actual - @Expected) * 1000000, 40, 20)
返回-0.00010000000 82740
所以你可以
使用内置SQL函数ROUND允许大致相同的数字被视为相等:
EXEC tSQLt.AssertEquals ROUND (@Expected, 14), ROUND (@Actual, 14)
对变量使用确切类型,例如NUMERIC (38, 19)
。将示例中的每个FLOAT替换为NUMERIC(38,19)似乎以提供相同的结果,但是当您添加上面提到的PRINT STR((@Actual - @Expected) * 1000000, 40, 20)
时,它现在可以准确打印
-0.0001000000 000000 ,表明PRINT语句中也存在不准确
当然,你的tSQLt.AssertEquals测试仍会失败,因为小数点后第10位的值不同。 (一个是...... 925 ......另一个是...... 935 ......)。如果您希望它通过,那么使用ROUND
将值四舍五入为9位数请参阅David Goldberg的优秀文章每个计算机科学家应该知道的关于浮点运算的内容 here或here标题舍入错误。
http://msdn.microsoft.com/en-us/library/ms173773.aspx
http://www.informit.com/library/content.aspx?b=STY_Sql_Server_7&seqNum=93