2016-07-21 3 views
13

История:«почти равные» в Жасмин

В Python встроенный в unittest рамках, есть «приближенное равенство» утверждение реализуется с помощью assertAlmostEqual() метода:

x = 0.1234567890 
y = 0.1234567891 
self.assertAlmostEqual(x, y) 

Который имеет номер десятичных знаков для проверки конфигурации.

И есть 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])) 

Вопрос:

Как сделать «почти равное» утверждение в JavaScript/Жасмин для поплавков и массива поплавков?

+0

Есть ли что-то, что мне не хватает в javascript, что алгоритм, описанный в документации на python, не будет работать? 'Тест, что первый и второй равны приблизительно (или не приблизительно), вычисляя разность, округляя до заданного числа десятичных знаков (по умолчанию 7) и сравнивая с нолем. Обратите внимание, что эти методы округляют значения до заданного числа десятичных знаков (т. Е. Как функция round()), а не значимые цифры. Если вместо мест указано значение delta, разница между первым и вторым должна быть меньше или равна (или больше) delta.' – dm03514

+0

@ dm03514 yup, сам алгоритм - это именно то, что я делаю. Взгляд, если есть что-то встроенное или лучший способ обратиться к нему с помощью javascipt/jasmine. Благодарю. – alecxe

+0

Знаете ли вы, как сравнивать числа с плавающей точкой для «почти» равенства? Это довольно стандартно, как это обычно реализуется. Возьмите разницу между сравниваемыми числами и проверьте, что она очень мала (меньше, чем какой-то эпсилон). –

ответ

12

Для одного поплавка используйте toBeCloseTo:

expect(x).toBeCloseTo(y, 7) 

Для буев, кажется, лучшее, что вы можете сделать, это цикл по нему и вызвать toBeCloseTo для каждой пары элементов (или написать свой собственный Искателя) , См. Expect an array of float numbers to be close to another array in Jasmine.

4

Вы можете добавить собственный тестер соответствия для типа 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 
}); 
Смежные вопросы