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);
});
确定它是精确的,但在这种情况下实际上意味着“精确”?是“。”之后的位数。应该是一样的吗?
我的情况:我想比较两个时间戳,以毫秒为单位;如果他们之间的差异小于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
如果精度仅适用于十进制数,我可以将整数除以1000得到十进制数,但无论如何,我不知道X是什么。 现在,我这样做:
expect(Math.abs(timestamp2-timestamp1)).toBeLessThan(100);
但它不是很易读,我想使用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
答案 0 :(得分:10)
正如@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
但除此之外,它不是很可调。遗憾的是,这确实意味着匹配器不适合您的目的,所以您可能会坚持使用您建议的解决方案。
答案 1 :(得分:-1)
以下是Jest文档中的一个示例,它帮助我更好地理解toBeCloseTo
匹配器的价值。
expect(0.1+0.2).toBe(0.3); // fails becouse it's 0.30000000000000004
expect(0.1+0.2).toBeCloseTo(0.3); // pass