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 +}