diff --git a/lib/internal/webidl.js b/lib/internal/webidl.js index d6bfea8e8479fa..e8dd6a675273c8 100644 --- a/lib/internal/webidl.js +++ b/lib/internal/webidl.js @@ -80,7 +80,7 @@ function evenRound(x) { // Convert -0 to +0. const i = integerPart(x) + 0; const reminder = MathAbs(x % 1); - const sign = MathSign(i); + const sign = MathSign(x); if (reminder === 0.5) { return i % 2 === 0 ? i : i + sign; } diff --git a/test/parallel/test-internal-webidl-converttoint.js b/test/parallel/test-internal-webidl-converttoint.js index 7e7c024387a0ec..0134700be7c49e 100644 --- a/test/parallel/test-internal-webidl-converttoint.js +++ b/test/parallel/test-internal-webidl-converttoint.js @@ -13,6 +13,13 @@ assert.strictEqual(evenRound(3.4), 3); assert.strictEqual(evenRound(4.6), 5); assert.strictEqual(evenRound(5), 5); assert.strictEqual(evenRound(6), 6); +// Fractional values in (-1, 0) ∪ (0, 1) whose truncated integer part is 0. +assert.strictEqual(evenRound(0.7), 1); +assert.strictEqual(evenRound(-0.7), -1); +assert.strictEqual(evenRound(0.3), 0); +assert.strictEqual(evenRound(-0.3), 0); +assert.strictEqual(convertToInt('x', -0.9999999, 64, { signed: true, clamp: true }), -1); +assert.strictEqual(convertToInt('x', 0.9999999, 64, { clamp: true }), 1); // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint assert.strictEqual(convertToInt('x', 0, 64), 0);