From 3de1b5c59a9c16748186705f0f8afe6172c9a00b Mon Sep 17 00:00:00 2001 From: He-Pin Date: Mon, 29 Jun 2026 06:09:37 +0800 Subject: [PATCH] fix: preserve negative zero in std.round --- sjsonnet/src/sjsonnet/stdlib/MathModule.scala | 3 ++- .../round_negative_zero_sign.jsonnet | 15 +++++++++++++++ .../round_negative_zero_sign.jsonnet.golden | 9 +++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet create mode 100644 sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet.golden diff --git a/sjsonnet/src/sjsonnet/stdlib/MathModule.scala b/sjsonnet/src/sjsonnet/stdlib/MathModule.scala index 950f7bf3..65612cf8 100644 --- a/sjsonnet/src/sjsonnet/stdlib/MathModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/MathModule.scala @@ -318,7 +318,8 @@ object MathModule extends AbstractFunctionModule { // adding 0.5 would invoke IEEE 754 round-to-even and produce the wrong // result for odd inputs (e.g. 2^53 - 1). Short-circuit to avoid it. if (x != x || math.abs(x) >= 4503599627370496.0) x - else if (x >= 0) math.floor(x + 0.5) + else if (x == 0) x + else if (x > 0) math.floor(x + 0.5) else math.ceil(x - 0.5) }, /** diff --git a/sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet b/sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet new file mode 100644 index 00000000..dcdb6a6c --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet @@ -0,0 +1,15 @@ +{ + // round(-0) should preserve negative zero sign + roundNegZero: std.round(-0), + // round(0) should stay positive zero + roundPosZero: std.round(0), + // round(-0.4) should produce -0 + roundNegSmall: std.round(-0.4), + // round(0.5) should produce 1 + roundHalfUp: std.round(0.5), + // round(-0.5) should produce -1 + roundNegHalf: std.round(-0.5), + // atan2 verifies sign of zero + signNegZero: std.atan2(std.round(-0), -1) < 0, + signPosZero: std.atan2(std.round(0), -1) > 0, +} diff --git a/sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet.golden new file mode 100644 index 00000000..1fca92fc --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/round_negative_zero_sign.jsonnet.golden @@ -0,0 +1,9 @@ +{ + "roundHalfUp": 1, + "roundNegHalf": -1, + "roundNegSmall": -0, + "roundNegZero": -0, + "roundPosZero": 0, + "signNegZero": true, + "signPosZero": true +}