茉莉花中的"几乎相等"

ale*_*cxe 14 javascript python testing unit-testing jasmine

故事:

在Python内置unittest框架中,通过assertAlmostEqual()方法实现了"近似相等"断言:

x = 0.1234567890
y = 0.1234567891
self.assertAlmostEqual(x, y)
Run Code Online (Sandbox Code Playgroud)

其中要检查的小数位数是可配置的.

而且,还有一个numpy.testing.assert_almost_equal()也适用于浮点数组:

import numpy.testing as npt
import numpy as np

npt.assert_almost_equal(np.array([1.0,2.3333333333333]), np.array([1.0,2.33333334]))
Run Code Online (Sandbox Code Playgroud)

问题:

如何在JavaScript/Jasmine中为浮点数和浮点数组成一个"几乎相等"的断言?

ken*_*ytm 15

对于单个浮动,请使用toBeCloseTo:

expect(x).toBeCloseTo(y, 7)
Run Code Online (Sandbox Code Playgroud)

对于一个float数组,你可以做的最好是循环它并调用toBeCloseTo每对元素(或编写自己的匹配器).请参阅期望一个浮点数数组靠近Jasmine中的另一个数组.


Flo*_* B. 6

您可以为float类型添加自定义相等性测试程序.它将在单个float和数组中的每个float上调用:

beforeEach(function () {
  jasmine.addCustomEqualityTester(function floatEquality(a, b) {
      if (a === +a && b === +b && (a !== (a|0) || b !== (b|0))) { // if float
          return Math.abs(a - b) < 5e-8;
      }
  });
});

it("Should compare array of floats", function() {
    expect([0.1234567890]).toEqual([0.1234567891]);  // OK
    expect([0.12345]).toEqual([0.12346]);            // FAIL
});
Run Code Online (Sandbox Code Playgroud)