diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index d41a87e..82a86ed 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -700,8 +700,10 @@ public: return StringEqual(rhs); case kNumberType: - if (IsDouble() || rhs.IsDouble()) - return GetDouble() == rhs.GetDouble(); // May convert one operand from integer to double. + if (IsDouble() || rhs.IsDouble()) { + float delta = GetDouble() - rhs.GetDouble(); // May convert one operand from integer to double. + return delta >= 0.0 && delta <= 0.0; // Prevent -Wfloat-equal + } else return data_.n.u64 == rhs.data_.n.u64; diff --git a/test/unittest/valuetest.cpp b/test/unittest/valuetest.cpp index b2647c0..c6a8879 100644 --- a/test/unittest/valuetest.cpp +++ b/test/unittest/valuetest.cpp @@ -339,7 +339,7 @@ TEST(Value, Int) { EXPECT_EQ(1234u, x.GetUint()); EXPECT_EQ(1234, x.GetInt64()); EXPECT_EQ(1234u, x.GetUint64()); - EXPECT_EQ(1234, x.GetDouble()); + EXPECT_NEAR(1234.0, x.GetDouble(), 0.0); //EXPECT_EQ(1234, (int)x); //EXPECT_EQ(1234, (unsigned)x); //EXPECT_EQ(1234, (int64_t)x); @@ -397,7 +397,7 @@ TEST(Value, Uint) { EXPECT_TRUE(x.IsUint()); EXPECT_TRUE(x.IsInt64()); EXPECT_TRUE(x.IsUint64()); - EXPECT_EQ(1234.0, x.GetDouble()); // Number can always be cast as double but !IsDouble(). + EXPECT_NEAR(1234.0, x.GetDouble(), 0.0); // Number can always be cast as double but !IsDouble(). EXPECT_FALSE(x.IsDouble()); EXPECT_FALSE(x.IsNull());