diff --git a/Makefile b/Makefile
index 105f4369..74074209 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ RE2C = re2c
 SED = gsed
 
 # additional flags
-FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated
+FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal
 
 all: json_unit
 
diff --git a/src/json.hpp b/src/json.hpp
index b845955f..82c389ab 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -1571,11 +1571,11 @@ class basic_json
             {
                 if (rhs.type() == value_t::number_integer)
                 {
-                    return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer);
+                    return approx(lhs.m_value.number_float, static_cast<number_float_t>(rhs.m_value.number_integer));
                 }
                 if (rhs.type() == value_t::number_float)
                 {
-                    return lhs.m_value.number_float == rhs.m_value.number_float;
+                    return approx(lhs.m_value.number_float, rhs.m_value.number_float);
                 }
                 break;
             }
@@ -2008,6 +2008,13 @@ class basic_json
         }
     }
 
+    /// "equality" comparison for floating point numbers
+    template<typename T>
+    inline static bool approx(const T a, const T b)
+    {
+        return not (a > b or a < b);
+    }
+
 
   private:
     //////////////////////
@@ -4275,7 +4282,7 @@ basic_json_parser_59:
 
                     // check if conversion loses precision
                     const auto int_val = static_cast<number_integer_t>(float_val);
-                    if (float_val == int_val)
+                    if (approx(float_val, static_cast<number_float_t>(int_val)))
                     {
                         // we basic_json not lose precision -> return int
                         return basic_json(int_val);
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 9d0a62cd..7b1c0d63 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -1571,11 +1571,11 @@ class basic_json
             {
                 if (rhs.type() == value_t::number_integer)
                 {
-                    return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer);
+                    return approx(lhs.m_value.number_float, static_cast<number_float_t>(rhs.m_value.number_integer));
                 }
                 if (rhs.type() == value_t::number_float)
                 {
-                    return lhs.m_value.number_float == rhs.m_value.number_float;
+                    return approx(lhs.m_value.number_float, rhs.m_value.number_float);
                 }
                 break;
             }
@@ -2008,6 +2008,13 @@ class basic_json
         }
     }
 
+    /// "equality" comparison for floating point numbers
+    template<typename T>
+    inline static bool approx(const T a, const T b)
+    {
+        return not (a > b or a < b);
+    }
+
 
   private:
     //////////////////////
@@ -3624,7 +3631,7 @@ class basic_json
 
                     // check if conversion loses precision
                     const auto int_val = static_cast<number_integer_t>(float_val);
-                    if (float_val == int_val)
+                    if (approx(float_val, static_cast<number_float_t>(int_val)))
                     {
                         // we basic_json not lose precision -> return int
                         return basic_json(int_val);