diff --git a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala index 4782f9e8..8750849e 100644 --- a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala @@ -179,8 +179,8 @@ object TypeModule extends AbstractFunctionModule { false } else { (x, y) match { - case (_: Val.Num, _: Val.Num) => - ev.compare(x, y) == 0 + case (x: Val.Num, y: Val.Num) => + x.rawDouble == y.rawDouble case (_: Val.Str, _: Val.Str) => ev.compare(x, y) == 0 case (_: Val.Bool, _: Val.Bool) => diff --git a/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet new file mode 100644 index 00000000..5c03cb13 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet @@ -0,0 +1,9 @@ +// std.primitiveEquals must treat -0.0 and 0.0 as equal (IEEE 754 semantics). +// This matches go-jsonnet and C++ jsonnet behavior. +std.assertEqual(std.primitiveEquals(-0.0, 0.0), true) && +std.assertEqual(std.primitiveEquals(0.0, -0.0), true) && +std.assertEqual(std.primitiveEquals(-0.0, -0.0), true) && +std.assertEqual(std.primitiveEquals(0.0, 0.0), true) && +std.assertEqual(std.primitiveEquals(-0.0, 1.0), false) && +std.assertEqual(std.primitiveEquals(0.0, 1.0), false) && +true diff --git a/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden new file mode 100644 index 00000000..27ba77dd --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/primitive_equals_negative_zero.jsonnet.golden @@ -0,0 +1 @@ +true