F#Assert.AreEquals失败了两个文字

Nic*_*ick 2 f# unit-testing

我有以下单元测试:

open System
open System.Collections.Generic
open Microsoft.VisualStudio.TestTools.UnitTesting

[<TestClass>]
type Test_Spectra () =

    let standard = new Standard1()

    [<TestMethod>]
    member x.LightTransmittance () =

        let input = Test_Spectra.TestSprectra1
        let expected = 0.32728222797751
        let actual = standard.LightTransmittance(input)

        Assert.AreEqual(expected, actual)
Run Code Online (Sandbox Code Playgroud)

当我运行单元测试时它会失败,但是'expected'和'actual'的值是相等的:

lightTransmittanceFails

预期和实际分别推断为浮动和双倍,但我认为浮动简单地说是双倍的简写.这有什么解释吗?

编辑 根据@ Gustavo的评论,我已将最后一行更改为:

Assert.AreEqual(expected, actual, 0.000000000000001)
Run Code Online (Sandbox Code Playgroud)

并且测试通过了.

Gus*_*Gus 6

浮点值的平等是棘手的,因为小的舍入差异将足以导致不等式.

当至少其中一个数字来自计算时,使用等式来比较代码中的两个浮点数通常是一个坏主意.这同样适用于单元测试.

你通常做的是定义什么是你的容忍度和使用比较,而不是平等.

    let input = Test_Spectra.TestSprectra1
    let expected = 0.32728222797751
    let actual = standard.LightTransmittance(input)

    let tolerance = 0.000000000000001

    Assert.AreEqual(expected, actual, tolerance)
Run Code Online (Sandbox Code Playgroud)