2016-07-21 14 views
13

Die Story:"fast gleich" in Jasmine

In Python eingebaute in unittest Rahmen, gibt es eine "annähernde Gleichheit" Behauptung über assertAlmostEqual() Methode implementiert:

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

, die die Zahl hat von Dezimalstellen zur Überprüfung konfigurierbar.

Und gibt es eine numpy.testing.assert_almost_equal(), die auch für die Arrays von Schwimmern arbeitet:

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])) 

Die Frage:

Wie eine "fast gleich" Behauptung in JavaScript/Jasmin machen für Schwimmer und eine Reihe von Schwimmern?

+0

Gibt es etwas, ich vermisse über Javascript, dass der Algorithmus in Python-Dokumentation beschrieben wird nicht funktionieren? 'Testen Sie, dass der erste und der zweite Wert annähernd (oder nicht annähernd) gleich sind, indem Sie die Differenz berechnen, auf die angegebene Anzahl von Dezimalstellen runden (Standard 7) und mit Null vergleichen. Beachten Sie, dass diese Methoden die Werte auf die angegebene Anzahl von Dezimalstellen (d. H. Wie die Funktion round()) und nicht auf signifikante Stellen runden. Wenn Delta anstelle von Stellen geliefert wird, dann muss die Differenz zwischen erster und zweiter kleiner oder gleich (oder größer als) Delta sein. – dm03514

+0

@ dm03514 yup, der Algorithmus selbst ist genau das, was ich vorhabe. Suchen, ob etwas eingebaut ist oder der beste Weg, um es mit Javascipt/Jasmin zu behandeln. Vielen Dank. – alecxe

+0

Wissen Sie, wie man Gleitkommazahlen für "fast" Gleichheit vergleicht? Es ist ziemlich Standard, wie es normalerweise implementiert wird. Nimm den Unterschied der Zahlen, die verglichen werden, und überprüfe, ob es sehr, sehr klein ist (weniger als einige Epsilon). –

Antwort

4

Sie können einen benutzerdefinierten Gleichheitsprüfer für den Float-Typ hinzufügen. Es wird auf einem einzelnen Schwimmer und auf jedem Schwimmer in einem Array:

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 
});