tSQLt断言失败消息数字精度

时间:2013-06-21 10:01:43

标签: tsqlt

如何在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>

1 个答案:

答案 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的优秀文章每个计算机科学家应该知道的关于浮点运算的内容 herehere标题舍入错误。

http://msdn.microsoft.com/en-us/library/ms173773.aspx

http://www.informit.com/library/content.aspx?b=STY_Sql_Server_7&seqNum=93