Jasmine toBeClose到底是什么第二个参数?

fre*_*sko 6 javascript unit-testing jasmine angularjs

Jasmine的文档很短; 经常就够了.不总是.

我想知道toBeCloseTo的第二个参数究竟是什么.官方参考仅显示:

it("The 'toBeCloseTo' matcher is for precision math comparison", function() {
    var pi = 3.1415926, e = 2.78;
    expect(pi).not.toBeCloseTo(e, 2);
    expect(pi).toBeCloseTo(e, 0);
});
Run Code Online (Sandbox Code Playgroud)

好吧它是精确的,但在这种情况下实际上意味着"精确"?是"."之后的位数.应该是一样的吗?

我的情况:我想比较两个时间戳,以毫秒为单位; 如果他们之间的差异小于100,那对我来说没问题.

例如,在下列情况下X的值是多少?

var timestamp1 = 1501254807000;
var timestamp2 = 1501254807099;
var timestamp3 = 1501254807100;
var precision = X;
expect(timestamp1).toBeCloseTo(timestamp2, precision); //this should pass
expect(timestamp1).toBeCloseTo(timestamp3, precision); //this should NOT pass
Run Code Online (Sandbox Code Playgroud)

如果精度仅用于十进制数,我可以将我的整数除以1000得到十进制数,但无论如何,我不知道什么是X.现在,我这样做:

 expect(Math.abs(timestamp2-timestamp1)).toBeLessThan(100);
Run Code Online (Sandbox Code Playgroud)

但它不是很易读,我想使用toBeCloseTo(因为它会出现......).

谢谢


编辑.以下结果可能会有所帮助:

expect(1000000.005).toBeCloseTo(1000000.000,3); //fails
expect(1000000.005).toBeCloseTo(1000000.000,2); //fails
expect(1000000.005).toBeCloseTo(1000000.000,1); //pass
Run Code Online (Sandbox Code Playgroud)

小智 12

正如@Nikolaj所述,"precision"参数指定匹配器将在舍入时检查精度的小数位数.

对于您给出的示例,前两个断言失败,因为分别在3位和2位小数处,发现数字不同(在2位小数处,尾随05变为舍入为1).小数点后1位数字相同.

匹配器确实接受负精度值,例如:

expect(1000).toBeCloseTo(1003,-1); //pass
expect(1000).toBeCloseTo(1100,-2); //fail
expect(1000).toBeCloseTo(1100,-3); //pass
Run Code Online (Sandbox Code Playgroud)

但除此之外,它不是很可调.遗憾的是,这确实意味着匹配器不适合您的目的,因此您可能会坚持使用您建议的解决方案.