fix: fix roundTo() corner cases
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 1 Jul 2023 19:41:48 +0000 (21:41 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 1 Jul 2023 19:41:48 +0000 (21:41 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
src/utils/Utils.ts
test/utils/Utils.test.ts

index c86afecaf71984b36378c12e3f6c9b02b964c7dc..04b40d30a322f66c24abe52d898531a35e136ea5 100644 (file)
@@ -142,12 +142,7 @@ export class Utils {
 
   public static roundTo(numberValue: number, scale: number): number {
     const roundPower = Math.pow(10, scale);
-    return Math.round(numberValue * roundPower) / roundPower;
-  }
-
-  public static truncTo(numberValue: number, scale: number): number {
-    const truncPower = Math.pow(10, scale);
-    return Math.trunc(numberValue * truncPower) / truncPower;
+    return Math.round(numberValue * roundPower * (1 + Number.EPSILON)) / roundPower;
   }
 
   public static getRandomFloatRounded(max = Number.MAX_VALUE, min = 0, scale = 2): number {
index 5732e57ed316673e1cbc538d9b853a0c33d90665..60d2e2aeee57278873765a47894beff72ed9ce9f 100644 (file)
@@ -134,6 +134,21 @@ describe('Utils test suite', () => {
     expect(randomInteger).toBeLessThanOrEqual(Math.floor(max));
   });
 
+  it('Verify roundTo()', () => {
+    expect(Utils.roundTo(0, 2)).toBe(0);
+    expect(Utils.roundTo(0.5, 0)).toBe(1);
+    expect(Utils.roundTo(0.5, 2)).toBe(0.5);
+    expect(Utils.roundTo(-0.5, 0)).toBe(-1);
+    expect(Utils.roundTo(-0.5, 2)).toBe(-0.5);
+    expect(Utils.roundTo(1.005, 0)).toBe(1);
+    expect(Utils.roundTo(1.005, 2)).toBe(1.01);
+    expect(Utils.roundTo(2.175, 2)).toBe(2.18);
+    expect(Utils.roundTo(5.015, 2)).toBe(5.02);
+    expect(Utils.roundTo(-1.005, 2)).toBe(-1.01);
+    expect(Utils.roundTo(-2.175, 2)).toBe(-2.18);
+    expect(Utils.roundTo(-5.015, 2)).toBe(-5.02);
+  });
+
   it('Verify getRandomFloat()', () => {
     let randomFloat = Utils.getRandomFloat();
     expect(typeof randomFloat === 'number').toBe(true);