diff --git a/include/rapidjson/internal/dtoa.h b/include/rapidjson/internal/dtoa.h index c8884027..bf686b0a 100644 --- a/include/rapidjson/internal/dtoa.h +++ b/include/rapidjson/internal/dtoa.h @@ -21,6 +21,7 @@ #include "itoa.h" // GetDigitsLut() #include "diyfp.h" +#include "ieee754.h" RAPIDJSON_NAMESPACE_BEGIN namespace internal { @@ -193,6 +194,9 @@ inline char* Prettify(char* buffer, int length, int k) { inline char* dtoa(double value, char* buffer) { if (value == 0) { + Double d(value); + if (d.Sign()) + *buffer++ = '-'; // -0.0, Issue #289 buffer[0] = '0'; buffer[1] = '.'; buffer[2] = '0'; diff --git a/test/unittest/readertest.cpp b/test/unittest/readertest.cpp index b6dffbcd..318f1880 100644 --- a/test/unittest/readertest.cpp +++ b/test/unittest/readertest.cpp @@ -187,6 +187,8 @@ static void TestParseDouble() { Reader reader; \ ASSERT_EQ(kParseErrorNone, reader.Parse(s, h).Code()); \ EXPECT_EQ(1u, h.step_); \ + internal::Double e(x), a(h.actual_); \ + EXPECT_EQ(e.Sign(), a.Sign()); \ if (fullPrecision) { \ EXPECT_EQ(x, h.actual_); \ if (x != h.actual_) \ @@ -197,6 +199,7 @@ static void TestParseDouble() { } TEST_DOUBLE(fullPrecision, "0.0", 0.0); + TEST_DOUBLE(fullPrecision, "-0.0", -0.0); // For checking issue #289 TEST_DOUBLE(fullPrecision, "1.0", 1.0); TEST_DOUBLE(fullPrecision, "-1.0", -1.0); TEST_DOUBLE(fullPrecision, "1.5", 1.5); diff --git a/test/unittest/writertest.cpp b/test/unittest/writertest.cpp index 0ef14234..642161ae 100644 --- a/test/unittest/writertest.cpp +++ b/test/unittest/writertest.cpp @@ -93,7 +93,7 @@ TEST(Writer, String) { TEST(Writer, Double) { TEST_ROUNDTRIP("[1.2345,1.2345678,0.123456789012,1234567.8]"); - + TEST_ROUNDTRIP("[-0.0]"); // Issue #289 } TEST(Writer, Transcode) {