From ab81a1672b05c05bb4e6b8d15bf4fe8859266f8f Mon Sep 17 00:00:00 2001
From: "mathias.chouet" <mathias.chouet@irstea.fr>
Date: Thu, 16 May 2019 12:25:43 +0200
Subject: [PATCH] Update floatAndDivMod function, update jasmine tests for real
 numbers comparison

---
 spec/real.spec.ts | 39 +++++++++++++++++++++++++++++++++++++++
 src/base.ts       |  4 ++++
 2 files changed, 43 insertions(+)
 create mode 100644 spec/real.spec.ts

diff --git a/spec/real.spec.ts b/spec/real.spec.ts
new file mode 100644
index 00000000..ab261187
--- /dev/null
+++ b/spec/real.spec.ts
@@ -0,0 +1,39 @@
+import { floatDivAndMod, isEqual } from "../src/base";
+
+/**
+ * Tests d'égalité, de divisions entières et de modulo, à la tolérance près
+ */
+
+const divAndModCases = [
+    { D: 3, d: 0.2, q: 15, r: 0 },
+    { D: 3, d: 0.1, q: 30, r: 0 },
+    { D: 3, d: 0.3, q: 10, r: 0 },
+    { D: 3, d: 3, q: 1, r: 0 },
+    { D: 3, d: 3.00000000001, q: 1, r: 0 }
+];
+
+for (const c of divAndModCases) {
+    describe("real numbers division and modulo - ", () => {
+        it(`(${c.D} / ${c.d}) should be ${c.q}, (${c.D} % ${c.d}) should be ${c.r}`, () => {
+            const divAndMod = floatDivAndMod(c.D, c.d);
+            expect(divAndMod.q).toBe(c.q);
+            expect(divAndMod.r).toBe(c.r);
+        });
+    });
+}
+
+const eqCases = [
+    { a: 0, b: 0, eq: true },
+    { a: 0, b: 0.0000000000001, eq: true },
+    { a: 0.0000000000001, b: 0, eq: true },
+    { a: 0.0000000000001, b: 0.0000000000001, eq: true },
+    { a: 0, b: 0.1, eq: false }
+];
+
+for (const c of eqCases) {
+    describe("real numbers equality - ", () => {
+        it(c.a + " should " + (c.eq ? "" : "not ") + " be equal to " + c.b, () => {
+            expect(isEqual(c.a, c.b)).toBe(c.eq);
+        });
+    });
+}
diff --git a/src/base.ts b/src/base.ts
index 40c54156..9b0c9494 100644
--- a/src/base.ts
+++ b/src/base.ts
@@ -96,5 +96,9 @@ export function floatDivAndMod(a: number, b: number, e: number = 1E-7): { q: num
             q++;
         }
     }
+    // si le modulo est nul à un pouïème, il est nul
+    if (isEqual(r, 0)) {
+        r = 0;
+    }
     return { q, r };
 }
-- 
GitLab