如何使用chai测试浮点数相等性?

41
我们正在使用Chai的BDD API编写单元测试。
我们如何断言浮点数相等性?
例如,如果我尝试进行此断言以检查返回值为66 2/3%:
expect(percentage).to.equal(2 / 3 * 100.0);

我遇到了这个错误:

AssertionError: expected 66.66666666666667 to equal 66.66666666666666
Expected :66.66666666666666
Actual   :66.66666666666667
2个回答

55
我也在寻找这个答案,在此问题以外,我还发现了一个有关功能请求的讨论,该请求导致添加了closeTo。使用这个方法,你可以指定一个值和+/- delta,所以基本上它允许你指定检查结果的精度。
percentage.should.be.closeTo(6.666, 0.001);

或者

// `closeTo` is an alias for the arguably better name `approximately`
percentage.should.be.approximately(6.666, 0.001);

或者

expect(percentage).to.be.closeTo(6.666, 0.001)

当然,这并不完美,因为这将批准6.665到6.667之间的任何数字。


我认为正确的语法应该是 percentage.to.be.closeTo(6.666, 0.001)。至少对我来说,should 没有起作用。 - Bruno Silvano
1
@BrunoSilvano 感谢您的反馈。这取决于您使用的断言类型(expectshould)。请参阅文档了解它们之间的区别以及如何初始化它们。 - GolezTrol
1
实际上,在 should 文档中并不是 closeTo,而是 approximately。因此,使用 should 的版本应该是 percentage.should.be.approximately(6.666, 0.001)。https://shouldjs.github.io/#assertion-approximately - Fuzzzzel
1
@Fuzzzzel 谢谢。看起来它在某个时候被重命名了。根据chai文档,它们是别名,但在shouldJs中没有提到closeTo。我已经将该示例添加到答案中。 - GolezTrol

13

within断言可用于检查浮点数是否接近其预期结果:

expect(percentage).to.be.within(66.666, 66.667);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接